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,用别的串口调试软件读数都正确,用这个为啥读出来就会有错的呢?

解决方案 »

  1.   

    上面就是代码我是做软件部分的。硬件部分是别人做的。
    程序就拖了一个text和一个mscomm到form1上,改了text的大小,其他都在代码里了。。
    串口每次发送32个字节,程序在我自己的机器上运行的时候n多3f,到处都是3f,到别人的机器上运行的时候就是上面的数据。实在不知道是啥毛病了来求教各位高人
      

  2.   

    我在做一些利用串口与硬件进行通讯的程序时发现,某些硬件受到自身条件限制时,只能采用边处理边发送的方式进行通讯,所以PC机端接收到的数据是“断断续续”而不是均匀连续的。这时如果采用对数据“整批接收,整批处理”的方法时,比较容易出现类似的“不稳定”情况。
    后来发现采用“逐字”的处理方法,情况比较稳定,这里提出供你参考:
    所谓逐字处理,就是每次只接收一个字节的数据,例如:
    启动设置:
      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