Private Sub Form_Load()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
MSComm1.Settings = "38400,e,8,1"
MSComm1.PortOpen = True
MSComm1.InBufferCount = 0
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 0
MSComm1.RThreshold = 0End SubPrivate Sub MSComm1_OnComm()
Dim buffer As Variant
Dim i As Integer
Dim str As StringSelect Case MSComm1.CommEvent
Case 2
buffer = MSComm1.Input
For i = LBound(buffer) To UBound(buffer)
If Val(buffer(i)) > 15 Then
str = Hex(Val(buffer(i)))
Else
str = "0" & Hex(Val(buffer(i)))
End If
Text1.Text = Text1.Text & str & " "
Next i
Case 1009
buffer = MSComm1.Input
'Text1.Text = Text1.Text & "1009"
For i = LBound(buffer) To UBound(buffer)
If Val(buffer(i)) > 15 Then
str = Hex(Val(buffer(i)))
Else
str = "0" & Hex(Val(buffer(i)))
End If
Text1.Text = Text1.Text & str & " "
Next i
End Select
End Sub
以上是代码
以下是读到的数据:
AA BB 01 02 03 04 00 11 00 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 3F 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 3F 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 3F 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 3F 15 16 17 18 19 1A 1B 3F 1D 1E 1F 20 21 22 3F 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 3F 33 03 1F 20 21 22 23 24 25 3F 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3F 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 3F 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 3F 47
其中只有几个字节错了。07和09中间的3f应该是08,1f和0b间的3f应该是01,18和1A之间的3f为19,29和15之间的3f应为02,1b和1d之间的3f为1c,22和24之间应为23,31和33之间应为32,25,26之间应为26,3d和29之间应为04,36和38之间应为37,最后一个3f应为46,用别的串口调试软件读数都正确,用这个为啥读出来就会有错的呢?
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
MSComm1.Settings = "38400,e,8,1"
MSComm1.PortOpen = True
MSComm1.InBufferCount = 0
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 0
MSComm1.RThreshold = 0End SubPrivate Sub MSComm1_OnComm()
Dim buffer As Variant
Dim i As Integer
Dim str As StringSelect Case MSComm1.CommEvent
Case 2
buffer = MSComm1.Input
For i = LBound(buffer) To UBound(buffer)
If Val(buffer(i)) > 15 Then
str = Hex(Val(buffer(i)))
Else
str = "0" & Hex(Val(buffer(i)))
End If
Text1.Text = Text1.Text & str & " "
Next i
Case 1009
buffer = MSComm1.Input
'Text1.Text = Text1.Text & "1009"
For i = LBound(buffer) To UBound(buffer)
If Val(buffer(i)) > 15 Then
str = Hex(Val(buffer(i)))
Else
str = "0" & Hex(Val(buffer(i)))
End If
Text1.Text = Text1.Text & str & " "
Next i
End Select
End Sub
以上是代码
以下是读到的数据:
AA BB 01 02 03 04 00 11 00 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 3F 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 3F 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 3F 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 3F 15 16 17 18 19 1A 1B 3F 1D 1E 1F 20 21 22 3F 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 3F 33 03 1F 20 21 22 23 24 25 3F 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3F 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 3F 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 3F 47
其中只有几个字节错了。07和09中间的3f应该是08,1f和0b间的3f应该是01,18和1A之间的3f为19,29和15之间的3f应为02,1b和1d之间的3f为1c,22和24之间应为23,31和33之间应为32,25,26之间应为26,3d和29之间应为04,36和38之间应为37,最后一个3f应为46,用别的串口调试软件读数都正确,用这个为啥读出来就会有错的呢?
程序就拖了一个text和一个mscomm到form1上,改了text的大小,其他都在代码里了。。
串口每次发送32个字节,程序在我自己的机器上运行的时候n多3f,到处都是3f,到别人的机器上运行的时候就是上面的数据。实在不知道是啥毛病了来求教各位高人
后来发现采用“逐字”的处理方法,情况比较稳定,这里提出供你参考:
所谓逐字处理,就是每次只接收一个字节的数据,例如:
启动设置:
MSComm1.Settings = "19200,N,8,1"
MSComm1.RThreshold = 1(长度超过1,就引起接收事件)
MSComm1.SThreshold = 0
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 1 (每次接收一个字节)
MSComm1.PortOpen = True
接收:
Dim Ch As Byte
Dim Ss As Variant
Dim S1 As String
Select Case MSComm1.CommEvent
Case comEvReceive
S1=""
While (MSComm1.InBufferCount >= 1)
Ss = MSComm1.Input
Ch = Ss(0)
S1 = S1 + IIf(Ch <= &HF, "0" + Hex(Ch), Hex(Ch)) + ","
Wend
Text1.Text = Text1.Text & S1
Case ......
................
End Select