源码:https://download.csdn.net/download/sequh/13709444
摘要:1)VB6如何通过串口发送和接收二进制数据
2)如何一次获取一组串口数据
正文如下:
1)二进制收发
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.RThreshold = 1 '收到RThreshold个字符数时触发事件MSComm1_OnComm
MSComm1.InputMode = comInputModeBinary '设置接受数据的类型是二进制类型数据
MSComm1.InputLen = 8 '一次性从接收缓冲区中读取所有数据(8个字节为一组!!)
2)发送二进制数据
' 发送时,要把二进制数据存储在byte数组中:
'二进制模式发送:BB 00 22 00 00 22 7E
Dim v(6) As Byte
v(0) = &HBB
v(1) = &H0
v(2) = &H22
v(3) = &H0
v(4) = &H0
v(5) = &H22
v(6) = &H7E
On Error Resume Next
MSComm1.Output = v
3)接收二进制数据
'思路是这样的:
这里的关键是调用sleep(20),把调用线程从线程调度器的可运行队列中移除20ms,这样程序在这20ms中是不再接收串口数据的。
然后从接收缓冲区中把数据每次按8个为一组,一组一组地进行取出,直到缓冲区数据全部取完为止。
这里有个知识点是:每MSComm1.Input一次就MSComm1.InBufferCount减小,减小的正是MSComm1.InputLen = 8
'MSComm1.InBufferCount属性:当前接收缓冲区接收到的数据的长度,
Private Sub MSComm1_OnComm()
Dim UB1%, UB2%, TM As Integer, i As Integer
Dim strData As String
Select Case MSComm1.CommEvent
Case comEvReceive
Sleep (20) '相隔20ms就可以正确接收到24个字节的数据
Do While MSComm1.InBufferCount > 0
TM = TM + 1
If TM = 1 Then
Rv_data = MSComm1.Input
Else
tmpRV = MSComm1.Input
UB1 = UBound(Rv_data)
UB2 = UBound(tmpRV) + 1 '元素比下标大1
ReDim Preserve Rv_data(UB1 + UB2)
For i = UB1 + 1 To UB1 + UB2
Rv_data(i) = tmpRV(i - UB1 - 1)
Next i
End If
Loop
If UBound(Rv_data) = 7 Then '没接收到EPC
'lblTID.Caption = "空"
Else
For i = 8 To 19
If Len(Hex(Rv_data(i))) = 1 Then
strData = strData & "0" & Hex(Rv_data(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格
Else '方便显示观察如: 00 0F FE
strData = strData & Hex(Rv_data(i)) & " "
End If
Next
strData = strData & "-" & Hex(Rv_data(5))
lblTID.Caption = strData
lblBg.BackColor = vbGreen
lblTID.ForeColor = &H80000012
strData = ""
newCount = 0
Erase tmpRV
Erase Rv_data
End If
End Select
End Sub