VB 串口获取数据问题
本人VB新人有个获取外部设备数据的串口程序,获取数据有些问题请教各位大侠。
通信协议中发送410命令到外部设备获取到数据包
数据包格式为 16进制
[解决办法]
发送"410"命令后,设备是不停的重复发送数据吗?
数据包是固定长度吗?是固定110字节,或者是55字节?
数据包如果不是固定长度:因为你设定是收到1字节就中断一次,收到110字节读取清理一次缓冲区,有可能出现:第一个数据包100字节,第二个数据包收到起始的10字节,然后你的程序处理第一个数据包,同时清理缓冲区,造成第二个数据包的起始10字节也被清理...以后的数据是第二个数据包的余下数据,但是已经不可能有包头的10个字节了,后继包也出现类似包头错过的情况.
正确的做法是:找到包头,找到包尾(如果没有找到包尾,就1,继续等,2把所有数据移动到自己的缓冲区,清理串口缓冲区),处理包头到包尾的数据(串口缓冲区或者自己的缓冲区),并且保留包尾后面的数据用于下次处理.
[解决办法]
Option ExplicitPrivate Declare Function GetTickCount Lib "kernel32" () As LongPrivate Sub Command1_Click() Dim lngP As Long Dim bytA() As Byte '存储发送内容 Dim varP As Variant ' Dim bytIn(100) As Byte '存储输入内容 Dim intP As Integer '发送命令 '以二进制方式发送数据,请先填写bytA,我不清楚你的通信协议,所以无法给出定论 '打个比方,你要发送410过去,那么就是: ReDim bytA(0 To 2) As Byte bytA(0) = &H34 '4的ASCII码 bytA(1) = &H31 bytA(2) = &H30 intP = 0 MSComm1.InBufferCount = 0 MSComm1.Output = bytA lngP = GetTickCount Do varP = MSComm1.Input bytIn(intP) = varP(0) Loop Until (GetTickCount - lngP) > 100 Or varP(0) = &H4 End SubPrivate Sub Form_Load() MSComm1.CommPort = 1 MSComm1.Settings = "9600,N,8,1" MSComm1.InputMode = comInputModeBinary MSComm1.InputLen = 1 MSComm1.RThreshold = 0 '这个至关重要 'MSComm1.EOFEnable = True If MSComm1.PortOpen = False Then MSComm1.PortOpen = True' MSComm1.Output = "410" End IfEnd Sub