读书人

请问一个关于串口通信控件MSComm接收的

发布时间: 2012-02-07 17:45:36 作者: rapoo

请教一个关于串口通信控件MSComm接收的问题
我需要从串口读取下位机发过来的数据包,并提取出相应的命令帧,再根据命令帧中不同的命令字来执行相应的操作。
下位机发过来的命令帧格式是这样的:
帧头2字节(3F D7)+命令字1字节+数据字节(不同的命令长度不同)+帧尾3字节(0F 0F 0F)
向大家请教一下在MSComm1_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) '把串口接收到的所有数据都先保存到数据缓冲池暂时不去处理,因为无法保证数据已经接收完整        coldata.Add xx(yy)    Next yyEnd SelectEnd Sub'用Timer控件循环对接收到的数据进行处理Private Sub Timer1_Timer()    if coldata.count<6 then exit sub   '收到的数据不足6个    Dim xx As Long    For xx = 1 To coldata.Count     '遍历所有串口收到的数据         if coldata.item(1)<>&H3F then             coldata.remove(1)    '收到的第一个字节不是3F,丢弃            exit for        end if        '……  代码略,按照通讯协议对串口收到的数据进行分析和处理        '…… 处理完成及时把已处理的数据从缓冲池中移除    Next xxEnd Sub
[解决办法]
MSComm1.RThreshold = 3
MSComm1.InputMode = comInputModeBinary

Private Sub MSComm1_OnComm()
Dim bytData() As Byte, bytHeader() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive

MSComm1.InputLen = 3
bytHeader = MSComm1.Input

If bytHeader(0) <> &H3F Or bytHeader(1) <> &HD7 Then
'错误处理
Exit Sub
End If

Select Case bytHeader(2) '根据命令字确定接收数据的长度
Case &Hxx
MSComm1.InputLen = xx
'......
End Selct

'等待数据和结束字符接收完毕
Do Until MSComm1.InBufferCount = MSComm1.InputLen + 3
Doevents
'可以加上超时处理
Loop

bytData = MSComm1.Input '提取到接收数据

MSComm1.InputLen = 3
bytHeader = MSComm1.Input '接收结束字符

If bytHeader(0) <> &HF Or bytHeader(1) <> &HF Or bytHeader(2) <> &HF Then
'错误处理
Exit Sub
End If

'执行命令
End Select
End Sub


[解决办法]
http://download.csdn.net/source/1262066
[解决办法]
上位机和下位机要有约定的,发送什么格式的数据代表什么意思遵守什么协议

探讨
非常感谢,我感觉理论上是行得通的,但是有一个小小的疑问,假如我说的是假如,下位机发送的第一个字节不是帧头怎么办?

读书人网 >VB

热点推荐