我需要接收下位机的一个34字节的数据,协议就是mscomm1.Settings = "9600,n,8,1"我用下边的代码接收,发现有的时候会有一次数据接收到没有解析出来,可能是接收的时候有问题。所以想在群里请教高手给指点下,要是这样接收34字节的数据,什么样的接收方式比较好,不会出现接收错误。谢谢(对方一共发3遍,每遍的间隔为20ms。)
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.RThreshold = 0
m = Timer
While Timer - m < 0.038 '从0.01到0.02(20sm)做延时
Wend
inByte = MSComm1.Input
For i = 0 To UBound(inByte)
If Len(Hex(inByte(i))) = 1 Then
str1 = 0 & Hex(inByte(i))
Text14 = str1
Else
str1 = Hex(inByte(i))
Text15 = str1
End If
strData = strData & str1
Text16 = strData
Next
End Select
MSComm1.RThreshold = 1我目前Mscomm1的设置如下
With MSComm1
.CommPort = 1
.Settings = "9600,n,8,1"
.InBufferCount = 0
.InputLen = 0
.RThreshold = 0
.InputMode = comInputModeBinary '以2进制接收
.PortOpen = True
End With
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.RThreshold = 0
m = Timer
While Timer - m < 0.038 '从0.01到0.02(20sm)做延时
Wend
inByte = MSComm1.Input
For i = 0 To UBound(inByte)
If Len(Hex(inByte(i))) = 1 Then
str1 = 0 & Hex(inByte(i))
Text14 = str1
Else
str1 = Hex(inByte(i))
Text15 = str1
End If
strData = strData & str1
Text16 = strData
Next
End Select
MSComm1.RThreshold = 1我目前Mscomm1的设置如下
With MSComm1
.CommPort = 1
.Settings = "9600,n,8,1"
.InBufferCount = 0
.InputLen = 0
.RThreshold = 0
.InputMode = comInputModeBinary '以2进制接收
.PortOpen = True
End With
解决方案 »
- #提问#:vsflexgrid的Click事件中(仅限于此事件),如和判断用户点击了单元行之外的空余处?
- 求用vb6。0写的计算器(给分100)
- 再问如何获取当前的屏幕信息并传送到远程的计算机上显示?
- 如何给线段定位颜色?
- setup factory6 安装制作问题
- !!!新春有礼!送大家一个自己写的简易手写识别系统!!!
- 通过DATAGRID怎么查询出符合条件的所有记录谢谢 (急!!!!!!!!!!!!!!!!!!!!)
- 帮我看看这个数组循环不出来
- 哪里有 vb 串口编程和数据库编程的详细资料啊!!!???
- 为什么ADO中的Recordset对象的Recordcount属性值为-1,怎么办?
- 用SendMessage实现ComboBox自动下拉后,鼠标就不见了
- vb入门一问:编译错误,子程序或函数未定义
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
t = GetTickCount()
Do
DoEvents
Loop Until GetTickCount - t > 20
inByte = MSComm1.Input
For i = lBound(inByte) To UBound(inByte)
If Len(Hex(inByte(i))) = 1 Then
str1 = 0 & Hex(inByte(i))
Text14 = str1
Else
str1 = Hex(inByte(i))
Text15 = str1
End If
strData = strData & str1
Text16 = strData
Next i
End Select
Private Sub Form_Load()
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub
Dim j
With MSComm3
Select Case .CommEvent
Case comEvReceive
j = .InBufferCount '取数据的字节数
recive = .Input '读取全部数据到recive If j > 34 Then j = 34 '对于超出34字节的数据截取数据为前34字节 Select Case j:
Case 34:
If ((recive(xx))) = &Hxx Then '条件是依据协议对取到的数据进行分析,数据是否异常
xxxxx '这里的代码对取到的正确数据,进行加工处理
Else
MsgBox "取到的数据异常"
End If
End Select
.InBufferCount = 0
Case Else
End Select
End With如果有什么问题,请再回复!
Mscomm1.RThreshold = 34
Mscomm1.InBufferSize= 34
然后我在我接收的代码里边把延时去了
Select Case MSComm1.CommEvent
Case comEvReceive
inByte = MSComm1.Input
For i = 0 To UBound(inByte)
If Len(Hex(inByte(i))) = 1 Then
str1 = 0 & Hex(inByte(i))
Text14 = str1
Else
str1 = Hex(inByte(i))
Text15 = str1
End If
strData = strData & str1
Text16 = strData
Next
End Select
这样就可以了。
Integer 变量存储为 16位(2 个字节)的数值形式,其范围为 -32,768 到 32,767 之间。
32736 < 32767
如果字节数定长:
Mscomm1.RThreshold = 32736
Mscomm1.InBufferSize= 4096
With MSComm1
.CommPort = 1
.Settings = "9600,n,8,1"
.InBufferCount = 0
.InputLen = 0
.RThreshold = 33 '32768
.InBufferSize = 33
.InputMode = comInputModeBinary '以2进制接收
.PortOpen = True
End WithPrivate Sub MSComm1_OnComm()
Dim inByte() As Byte
Dim i As Integer
Dim Buf(0 To 1031) As String
Select Case MSComm1.CommEvent
Case comEvReceive
inByte = MSComm1.Input
For i = 0 To UBound(inByte)
If Len(Hex(inByte(i))) = 1 Then
str1 = 0 & Hex(inByte(i))
Else
str1 = Hex(inByte(i))
End If
strData = strData & str1
Next
Buf(i) = strData
i = i + 1
End Select
If i > 1031 Then
Open App.Path & "\Buf.txt" For Output As #1
For i = 1 To 1031
Print #1, Buf(i)
Next i
Close #1
End If
End Sub但是这样接收完我想判断如果下位机给我发送代表数据结束的代码“FF01”这个怎么在接收数据的时候判断啊?
UBound(inByte)等于33,+1也就是34,永远也不会大于1031。