请教一个关于串口通信控件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
[解决办法]
上位机和下位机要有约定的,发送什么格式的数据代表什么意思遵守什么协议