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

VB串口怎么判断接收完数据

2012-01-15 
VB串口如何判断接收完数据?发送一组数据,发送后会自动接收一些数据,是定长170个字节的数据,但是接收的数据

VB串口如何判断接收完数据?
发送一组数据,发送后会自动接收一些数据,是定长170个字节的数据,但是接收的数据是动态的,可能接收10条,可能会接收20条这样的数据
如何判断接收完数据呢?接受完数据后会自动执行cmdBCkjl0102按钮点击 call cmdBCkjl0102_click
  Dim receiveData As String ' 数据暂存
  Dim Counter As Integer ' 接收数据个数计数器

Private Sub MSComm1_OnComm()
On Error GoTo Err
  Dim ReceiveArr() As Byte ' 接收数据数组
  ' Dim receiveData As String ' 数据暂存
 ' Dim Counter As Integer ' 接收数据个数计数器
  Dim I As Integer ' 循环变量
 If (MSComm1.InBufferCount > 0) Then
  Counter = MSComm1.InBufferCount ' 读取接收数据个数
  receiveData = "" ' 清缓冲

  ReceiveArr = MSComm1.Input ' 数据放入数组

  For I = 0 To (Counter - 1) Step 1 ' 数据格式处理

  If (ReceiveArr(I) < 16) Then
  receiveData = receiveData & "0" + Hex(ReceiveArr(I)) ' 小于16,前面加0
  Else
  receiveData = receiveData & Hex(ReceiveArr(I)) ' 加空格显示
  End If

  Next I
   
  KJL.Text = KJL.Text & receiveData
  KJL.SelStart = Len(KJL.Text)
  End If
Err:
End Sub


这段代码是接收数据的代码,显示在ICJL文本框中,该如何判断ICJL文本框中的数据已经是全部接收完了,然后再自动执行cmdBCkjl0102按钮单击事件呢?

Private Sub KJL_Change()
Dim yyy As String
yyy = Len(KJL)
LSJLZS.Caption = yyy / 336
Label2.Caption = Len(receiveData) 
  If Len(receiveData) = yyy / 336 Then  
 Call cmdBCkjl0102_Click
End If
End Sub
奇怪的是每次从Label2.Caption =Len(receiveData)读取到的数据长度是不一样的,导致Len(receiveData) 不等于 yyy / 336这是什么原因?


[解决办法]
如果是自己定义的通讯协议,可以按数据包处理,然后在包头加上数据长度,包尾加上校检码,
这样在协议层可以很大程度上保证数据的完整性。
如果不是自己定义的通讯协议,那就看原来别人定义的协议有没有数据完整性的处理,如果没有,
就很难确保,只能根据别人定西的内容自己处理,若出现干扰、频率误差出现数据丢失,也是没有
办法的事。不过通常硬件层很少会出现这样的现象。所以只要根据收到的内容处理就可以了。
至于程序处理方法上,你可以参考一下下面的帖子我的代码:
http://topic.csdn.net/u/20110404/10/32a8336b-be14-4135-ba3c-9e604a8a2b4e.html

热点排行