VB与485通讯问题
以前使用的仪表全是232接口的,所以采用vb的mscomm控件很轻松的获取到了仪表连续发送来的数据,但是现在仪表换成了只有485通讯的,我在超级终端里什么也看不到(不过有时候会得到一个字符,如‘~’之类的),并且现在是一台计算机要连接两块仪表,通过仪表地址访问它们,并将其中的一些数据读取出来。该仪表的相关通信协议我贴出来,麻烦各位高手(特别是of123 老兄指导指导)抽出你们宝贵的时间指导指导,谢谢。
——————————————————————————————————————————————
下面我先把之前采集232接口的代码贴出来:
Private Sub MSComm1_OnComm()
Dim Sinput As String
Dim bzw As Integer
Select Case MSComm1.CommEvent
Case comEventRxOver
MSComm1.InBufferCount = 0
Case comEvReceive
Sinput = MSComm1.Input
bzw= InStr(1, Sinput, " ~", vbTextCompare)
dqsj= (Val(Mid$(sinput, bzw+ 3, 7)))
End Select
End Sub
'上面程序中dqsj为全局变量,在窗口加载时,打开com1口,则可读到dqsj为仪表的数据,即程序所需的数据。
————————————————————————————————————————————————
现在的两块仪表的485输出通过并联连接到rs232/rs485转换器然后连接在计算机上。——硬件连接,没有问题。
该两块仪表的通讯协议(厂家提供)如下:
***********************************************************************************该RS485接口的仪表的通讯协议为:
一、数据传输方式:异步10位:1位起始,8位数据,1位停止,无校验位。
二、机号(地址):01和02——共两块表,要读出两块表中数据。
三、读写命令: ①读数据(03H)一次读完“瞬时量”,“班产量”,“累积量”和“给定值”4个量,4个量均为浮点数。 ②写数据(10H):写“给定值”,浮点数。
四、数据存储地址(起始地址) 0000H:16字节(8个字)依次为:瞬时量,班产量,累积量和给定值。 ***********************************************************************************
我试着编写了一段程序,但是感觉不对,读取出来的全是乱码。
望各位高手斟酌一下,谢谢各位。
[解决办法]
rs232和rs485,如果用于应答的场合(rs485不能用于同个瞬间即接收又发送),只有物理的差别,没有逻辑的差别,程序和rs232的,是完全一样,你重要的是要做好通信参数设置,理解好协议,按照协议做,即可。另外,你的OnComm函数接收估计有问题,Sinput = MSComm1.Input 只是一次得到数据,但数据可能会分次到达,(RThreshold决定每次事件接收几个字符)
[解决办法]
1楼说正确, Case comEvReceive 下面代码,要么加上MSComm1.InBufferCount长度来判断,要么干延时,要么MSComm1.RThreshold阀值来控制
[解决办法]
RS485 是通讯的物理层协议,即 EIA/TIA-485 协议。一般来说,数据链路层是采用一主多从架构。
但是,由于应用层协议是自定义的,可以说是五花八门。如果,
* 有些厂商将地址广播和应用命令分开,采用不同的帧格式加以区分。只有地址匹配的从设备进入工作状态,其他设备仍等待下一次地址广播。
* 目前更多的厂商采用将地址嵌入应用命令包的形式。你的估计就是这一类。
你应该向厂商进一步询问:
1 波特率是多少?是否缺省的 9600?
2 命令格式是什么样的?最好有例子。读和写的都要。
2 从机应答是什么样的?写操作时从机是否有状态返回?
总之,要把协议搞清楚。
清楚协议后,你先用串口调试工具验证一下,然后再写代码。
你原来 RS232 下是仪表主动发送数据的吗?现在肯定需要主机发送命令的,因为要发送地址。
[解决办法]
Private Sub Command2_Click()
Dim b(3) As Byte
Dim V
Dim InData() As Byte
With MSComm1
.Settings = "1200,n,8,1"
b(0) = 1
b(1) = 3
.PortOpen = True
.Output = (b)
sleep 100 'api函数,自己在apiiewer中加人
V = .Input
InData = V
End With
End Sub