vb6.0 MScomm接收数据问题
- VB code
MSComm1.CommPort = 1 MSComm1.Settings = "9600,N,8,1" MSComm1.RThreshold = 17 MSComm1.InputLen = 0 MSComm1.SThreshold = 1 MSComm1.InputMode = comInputModeBinary If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
如上代码,我写在Form_Load()中。MSComm1.RThreshold被我写死了。与一个设备或者同类型设备通信时没有问题。
但是我现在要添加其他的设备,还包括与单片机通信,这样,返回的数据长度就有可能不一样(都使用modbus协议)。
请问,当与多个设备通信,返回的数据长度不同,在MSComm1_OnComm()中如何判断接收呢?
[解决办法]
gddennis 我的回复你没有看到么??
我问过你:你说的 帧长度不一样 指的是什么??? 是说情况一:单片机某个单片机A ,有时候发送7个字节的帧,有时候发送5个字节的帧,有时候发送9个字节的帧,有时候....................。
还是说情况2:单片机A只发9个字节的帧, 单片机B只发送8个字节的帧 ??
我告诉你吧 可能是 大概是:
假设是情况2:那要简单点,首先要说的是 要用oncomm事件,那么会出现接收超过8字节会多次进入oncomm程序的情况,要想进入一次oncomm就全部接受帧的所有字节,就要加延时,在Case comEvReceive后面 加延时,延时多长时间呢,比如说一个帧20个字节,那么你就延时30毫秒,应该没有问题。如果有问题,就加大延时时间。
然后再判断接收的帧的长度
IF (接收到单片机A的9个帧) then
ReceiveFrame() = MSComm1.Input '接收的帧转移到数组里面
判断接收的帧是否符合你的协议
ELSE IF (接收到单片机B的8个帧) then
ReceiveFrame() = MSComm1.Input '接收的帧转移到数组里面
判断接收的帧是否符合你的协议
ELSE
MSComm1.InBufferCount = 0'清空缓存
好情况2到此结束。
现在说情况1
情况1就麻烦了,我也没有试过
还是不说了
============================================
9楼说的很好,一个字节一个字节的接收 对于处理不定长的情况很好
我现在想到的方法是 inputlen = 1
MSComm1.RThreshold = 1 不知道能不能实现一个字节一个字节的接收。
那就需要定时器,如果设定时间内没有接收到数据 就认为本帧传输完毕。
以后有时间 要试一试
==========================================
一般来说 发送数据采用轮询 接收数据采用中断
[解决办法]
[解决办法]
给你个例子学习:
- VB code
'定义一个数据缓冲池,这里用Collection对象作缓冲池,你也可以用数组或其他东西Dim coldata As CollectionPrivate Sub Form_Load() '初始化数据缓冲池 Set coldata = New Collection '初始化并打开串口 MSComm1.CommPort = 1 MSComm1.Settings = "9600, n, 8, 1" MSComm1.RThreshold = 1 '设置为每收到一个字节数据触发一次Oncomm事件 MSComm1.InputMode = comInputModeBinary MSComm1.PortOpen = TrueEnd SubPrivate Sub MSComm1_OnComm()Dim yy As LongSelect Case MSComm1.CommEventCase comEvReceive Dim xx() As Byte xx = MSComm1.Input For yy = 0 To UBound(xx) - 1 '把串口接收到的所有数据都先保存到数据缓冲池暂时不去处理,因为无法保证数据已经接收完整 coldata.Add xx(yy) Next yyEnd SelectEnd Sub'用Timer控件循环对接收到的数据进行处理,如果你会用多线程的话可以另开一个线程来单独处理Private Sub Timer1_Timer() Dim xx As Long For xx = 1 To coldata.Count '遍历所有串口收到的数据 '代码略,按照通讯协议对串口收到的数据进行分析和处理 '处理完成及时把已处理的数据从缓冲池中移除 Next xxEnd Sub