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

VB 串口获取数据有关问题

2012-01-11 
VB 串口获取数据问题本人VB新人有个获取外部设备数据的串口程序,获取数据有些问题请教各位大侠。通信协议中

VB 串口获取数据问题
    本人VB新人有个获取外部设备数据的串口程序,获取数据有些问题请教各位大侠。
    通信协议中发送410命令到外部设备获取到数据包
    数据包格式为     16进制


[解决办法]
发送"410"命令后,设备是不停的重复发送数据吗?
数据包是固定长度吗?是固定110字节,或者是55字节?

数据包如果不是固定长度:因为你设定是收到1字节就中断一次,收到110字节读取清理一次缓冲区,有可能出现:第一个数据包100字节,第二个数据包收到起始的10字节,然后你的程序处理第一个数据包,同时清理缓冲区,造成第二个数据包的起始10字节也被清理...以后的数据是第二个数据包的余下数据,但是已经不可能有包头的10个字节了,后继包也出现类似包头错过的情况.

正确的做法是:找到包头,找到包尾(如果没有找到包尾,就1,继续等,2把所有数据移动到自己的缓冲区,清理串口缓冲区),处理包头到包尾的数据(串口缓冲区或者自己的缓冲区),并且保留包尾后面的数据用于下次处理.


[解决办法]

探讨



数据包长度不固定

既然它一次给我发送一个包,我可不可以一次获取这个包?不要一个一个字节获取?如果一次获取的很完整不就可以很好的分析处理了?


[解决办法]
VB code
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 

热点排行