RS232与JC485串口通讯的不稳定问题,百思不得其解 点击:3997 | 回复:6



行之路人

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 5回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2004年11月11日
发表于:2004-11-11 18:15:00
楼主
环境:智能显示调节仪表一块(使用JC485串口通讯,有自己的通讯协议,使用CRC-16校验),RS-232与JC485串口转换模块一块,连接线若干,win2000系统,VB开发工具(使用MSComm作为通讯控件)。 目的:在2000下,使用VB制作一串口通讯软件,实现对仪表参数的读取及控制等功能。 目前没有问题的部分:硬件连路经串口测试精灵验证,可以收发经CRC-16校验过的数据,没有问题。VB的程控码发送部分经由硬件电路的测试,仪表有正常反应,没有问题。CRC-16校验程序,经验证,也没有问题。 情况:在VB中调试接收仪表的参数码程序时,显示窗口中可以显示由仪表传回的参数,显示形式是乱码,程序中没有进行码字转换,到此为止都可以理解,但是问题就在这时出现了,当我在调试情况下,又点击发送程控码,给仪表发送数据时,仪表有正常反应,在点按仪表上的按键后,程序就再也接受不到来自仪表的数据了,更奇怪的是,我关闭程序后,用从网上档的串口精灵一试,却也是只能发,无论怎样也收不到仪表的数据了。 结:到发稿时止,手头的所有的通讯程序,都只能给表发数据,且仪表反应正常,而不能收到来自表的数据。 难道是电磁干扰,或其他身摸莫名的原因。 望各位高手授业,解惑,多谢。


楼主最近还看过



行之路人

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2004年11月11日
发表于:2004-11-15 09:32:00
1楼
后来经实验证明,此问题是正常的,当使用VB程序向仪表发设置数据时,上位机程序扮演下位机角色,这时再点击仪表面板上的设置键,表就不会有反应。 多谢各位点击浏览

大鸟一人

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 152回
  • 年度积分:0
  • 历史总积分:186
  • 注册:2004年4月16日
发表于:2004-11-29 08:36:00
2楼
RS232/RS485转换模块是不是坏了,有些便宜的转换模块经常这样

罗开

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2007年12月10日
发表于:2004-12-17 09:42:00
3楼
大哥可找到你了。我手头正好有这么一块表,但我按说明书上说的协议写了程序可是通信就是不好使啊。能把你的程序发给我看看吗。谢谢了。 2000yysos@sohu.com

行之路人

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2004年11月11日
发表于:2004-12-21 15:27:00
4楼
这位仁兄,我建议你上网搜索,下个串口精灵,按照协议把数据算出来,发给仪表,便可实现互通。

行之路人

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2004年11月11日
发表于:2004-12-21 16:38:00
5楼
Private ReturnData(1) As Byte '定义数组,用于显示 ---------------------- Function CRC16(data() As Byte) As String Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器 Dim CL As Byte, CH As Byte '多项式码&HA001 Dim SaveHi As Byte, SaveLo As Byte Dim I As Integer Dim Flag As Integer CRC16Lo = &HFF CRC16Hi = &HFF CL = &H1 CH = &HA0 For I = 0 To UBound(data) CRC16Lo = CRC16Lo Xor data(I) '每一个数据与CRC寄存器进行异或 For Flag = 0 To 7 SaveHi = CRC16Hi SaveLo = CRC16Lo CRC16Hi = CRC16Hi \ 2 '高位右移一位 CRC16Lo = CRC16Lo \ 2 '低位右移一位 If ((SaveHi And &H1) = &H1) Then '如果高位字节最右侧一位为1 CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后左侧补1 End If '否则自动补0 If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或 CRC16Hi = CRC16Hi Xor CH '高低位数据排列方式:HiLo CRC16Lo = CRC16Lo Xor CL End If Next Flag Next I ReturnData(0) = CRC16Hi 'CRC高位 ReturnData(1) = CRC16Lo 'CRC低位 CRC16 = ReturnData End Function ------------------------------- Private Sub Command1_Click() '验证程序 Dim comput() As Byte ReDim comput(7) As Byte '使用时,只需根据数据长短改动此处数组的大小和内容即可 comput(0) = &H1B comput(1) = &H5 comput(2) = &H1 comput(3) = &H0 comput(4) = &H51 comput(5) = &H2 comput(6) = &H0 comput(7) = &H1 Call CRC16(comput()) Label1.Caption = ReturnData(0) Label2.Caption = ReturnData(1) End Sub 此程序经VB验证可用,使用时在窗体上添加两个Label控件和一个Command控件,无须做任何其他更改,便可运行。校验码是0xA001。

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2001年6月23日
发表于:2005-01-27 10:20:00
6楼
能否EMAIL“JC485通讯协议”给我,谢谢

热门招聘
相关主题

官方公众号

智造工程师