首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB与485通讯有关问题

2013-07-04 
VB与485通讯问题以前使用的仪表全是232接口的,所以采用vb的mscomm控件很轻松的获取到了仪表连续发送来的数

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


[解决办法]
通常情况下 通信的命令桢格式如下:
STX+ADD+CMD+[Data]+ETX+CHECK
STX:通信命令起始符号,是一个通信命令桢的开始。这个字符不可重复。
ADD:下位机地址,每个下位机都拥有惟一的下位机地址,它标识了上位机通信的对象,不可重复。
CMD:通信命令,用户定义通信功能,一般分为:读写两种。
Data:可选,作为对CMD的补充,比如你要对下位机写数据,那么这个Data就可以作为写入的数据。
ETX:通信命令桢的结束符号,是一个命令桢的结束,这个字符也是不可重复的。
CHECK:校验和,一般是对从STX到ETX的一种校验计算,通信双方可以通过算法计算出正确的校验值,和这个通信接收到的值进行比较,如果相同,表示本次通信正确,如果不相同表示本次通信不正确。 
[解决办法]
引用:
以前测试过一次,不过那时候不清楚是电脑串口本身问题还是什么,记得改成485以后,在接收缓冲区里收到的数据会包括自己原先发出去的数据包。


从“接收”数据中看到发送的内容,很有可能是接收没有完成,缓存中的发送数据没有被覆盖。既然你接收数据是定长的 16 字节,不妨设置 RThreshold = 16。这样,接收完成时才会触发 OnComm() 事件。

一定要记住,串口通讯是极低速的过程(特别当波特率很低时),PC 运行比它快几个数量级。

热点排行