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

vb6.0 MScomm接收数据有关问题

2012-01-08 
vb6.0 MScomm接收数据问题VB codeMSComm1.CommPort 1MSComm1.Settings 9600,N,8,1MSComm1.RThreshol

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 不知道能不能实现一个字节一个字节的接收。
那就需要定时器,如果设定时间内没有接收到数据 就认为本帧传输完毕。

以后有时间 要试一试

==========================================


一般来说 发送数据采用轮询 接收数据采用中断


[解决办法]
探讨
这个标志字节是什么呢?是地址码吗? 还是帧的开始和结束标志?OnComm()接收到的数据中没看到开始和结束标志啊

[解决办法]
给你个例子学习:
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 

热点排行