Input 属性示例
该例子说明如何从接收缓冲区读取数据。Private Sub Command1_Click()
Dim InString as String
Dim bte() As Byte
Dim L As Long
Dim i As Long
' 读取所有可用数据。
MSComm1.InputLen = 0' 检查数据。
If MSComm1.InBufferCount Then
   ' Read data.
   InString = MSComm1.Input
  L=LenB(InString)-1
   ReDim bte(L-1)
  for i=0 to L-1
   bte(i)=AscB(MidB(InString,i+1,1))
  next
End If
End Sub

解决方案 »

  1.   

    上贴16行应改为:
    L=LenB(InString)
      

  2.   

    参考:http://www.vbgood.com/thread-83700-1-1.html
      

  3.   

    Case comEvReceive
        Do Until MSComm.InBufferCount >= 10
            DoEvents
        Loop    indata = MSComm.Input
        bte = StringConv(indata, FromUnicode)
        Text2 = ""
        For i = 0 To 9
            Text2 = Text2 & Right("0" & Hex(bte(i)), 2) & " "
        Next i
    End Select
    End Sub
      

  4.   

    Private Sub MSComm_OnComm()
    Dim indata As Variant
    Dim bte() As Byte
    ReDim bte(0 To 10)
     Select Case MSComm.CommEvent
     Case comEvReceive
     
      'indata = MSComm.Input
    bte=MSComm.Input
    检测bte数组长度,数据一次性都接收到了
    print bte(0),
    print bte(1),
    print hex(bte(2)
    ........
     
      

  5.   

    那时因为他假定你的发送端发送的就是字符编码。如果不是,你就要将你的每字节数值转换成两字节十六进制字符串。事实上,通讯通道上不存在你所说的十六进制数据,只有二进制数据。就比如说 FF,如果是数值,在线路上传的就是 11111111b(255 = &HFF);如果是 ASCII 编码的字符,就是 01000110b(70 = &H46),01000110b。你说接收到就是十六进制数据,一般就理解成十六进制字符串,也就是 ASCII 编码串。VB 提供了数值转换成十六进制字符串的函数接口:Hex()
      

  6.   

    仅供参考Dim i As Long
    Dim bytesTotal As Long
    Dim lnx As String
    Dim iBuf() As Byte    bytesTotal=5
        ReDim iBuf(bytesTotal-1)
        iBuf(0)=&h12
        iBuf(1)=&h56
        iBuf(2)=&hab
        iBuf(3)=&h89
        iBuf(4)=&hef    '显示iBuf中每个字节
        i = 0
        lnx = "BYTE:" + Right("0000000" + Hex(i), 8) + "-"
        For i = 0 To bytesTotal - 1
            lnx = lnx + " " + Right("0" + Hex(iBuf(i)), 2)
            If i Mod 16 = 15 Then
                Debug.Print lnx
                lnx = "BYTE:" + Right("0000000" + Hex(i + 1), 8) + "-"
            End If
        Next
        i = bytesTotal - 1
        If i Mod 16 <> 15 Then
            Debug.Print lnx
        End If
      

  7.   

    那时因为他假定你的发送端发送的就是字符编码。如果不是,你就要将你的每字节数值转换成两字节十六进制字符串。事实上,通讯通道上不存在你所说的十六进制数据,只有二进制数据。就比如说 FF,如果是数值,在线路上传的就是 11111111b(255 = &HFF);如果是 ASCII 编码的字符,就是 01000110b(70 = &H46),01000110b。你说接收到就是十六进制数据,一般就理解成十六进制字符串,也就是 ASCII 编码串。VB 提供了数值转换成十六进制字符串的函数接口:Hex()具体在代码里应该怎么修改呢??
    直接用bte(i)=Hex(bte(i))的话会提示下标越界
    我要在text2里显示显示出来的话怎么写??
      

  8.   

    实际上,你的另一个问题是,当你接收到一个字节时,OnComm 就被触发了。由于 PC 运行速度远高于串口通讯速度,你处理后续字节肯定会超前,造成越界问题。你的选择:
    1 事先设置 MSComm1.RThreshold = 10,等接收到 10 个字节时再触发 OnComm 事件;
    2 你在 OnComm 事件中等等缓存中接收到 10 个字节,如 4 楼代码;
    3 indata = MSComm.Input 后测试 indata 的长度,只处理接收到的字节,如 1 楼代码。因为 On Comm 会反复触发,字符会不断被处理。当然了,如果发送端连续发送的话,信息会连在一起。