Option Explicit 
Dim inData As String 
Dim a() As Byte Private Sub Form_Load() 
MSComm1.Settings = "9600,n,8,1" 
MSComm1.RThreshold = 1 
MSComm1.InputMode = comInputModeBinary '二进制接收 
MSComm1.PortOpen = True 
End Sub Private Sub MsComm1_OnComm() 
Dim intInputLen As Integer 
Dim i As Integer 
Select Case MSComm1.CommEvent 
Case comEvReceive 
'此处添加处理接收的代码 
intInputLen = MSComm1.InBufferCount 
ReDim a(intInputLen) 
a = MSComm1.Input 
For i = 0 To UBound(a) 
If Len(Hex(a(i))) = 1 Then 
inData = inData & "0" & Hex(a(i)) 
Else 
inData = inData & Hex(a(i)) 
End If 
Next 
Text2 = inData 
End Select 
End Sub 问题:既然MSComm1.RThreshold = 1 ,那么每接收一个字节就触发一次oncomm事件,那intInputLen = MSComm1.InBufferCount ,intInputLen不是应该等于1吗?a = MSComm1.Input ,.input不应该也是一个字节吗?那么UBound(a) 不就是0吗?只有a(0)里有数据,应该是8位2进制吧? 那么为什么inData里是很多个字符呢?另外:我每接收一个字节,就把它input出来,这时候.InBufferCount 是不是应该等于0 了,但好象.InBufferCount 并不固定?为什么?? 

解决方案 »

  1.   

    设置MSComm1.RThreshold = 1是接收缓冲区到达1字节就必然产生接收OnComm事件.
    不是接收到N字节,就一定产生N次OnComm事件.
    LZ:为1个串口通信的疑问,在CSDN和BAIDU共发了6个贴子.但我感觉LZ思路有问题,你应将网络搜索的代码消化,并依据你自己的实际需求和通信协议和数据帧约定来组织你的代码算法和写出代码.
      

  2.   


    我知道不是接收N个字节就产生N次OnComm事件,但我每接收一个字节就去处理,读出来。那应该是读出一个字节啊??
      

  3.   

    那是因为有后续的数据发送过来了。虽然你是每接受一个字符就触发一次事件,但并不代表你接受到数据触发了事件时就没有数据过来,
    建议你将代码如此修改:
    Option Explicit 
    Dim inData As String 
    Dim a() As Byte Private Sub Form_Load() 
    MSComm1.Settings = "9600,n,8,1" 
    MSComm1.RThreshold = 1 
    MSComm1.InputMode = comInputModeBinary '二进制接收 
    MSComm1.PortOpen = True 
    End Sub Private Sub MsComm1_OnComm() 
    Dim intInputLen As Integer 
    Dim i As Integer 
    Select Case MSComm1.CommEvent 
    Case comEvReceive 
    '此处添加处理接收的代码 
    MSComm1.RThreshold = 0   '屏蔽事件触发
    intInputLen = MSComm1.InBufferCount 
    ReDim a(intInputLen) 
    a = MSComm1.Input 
    For i = 0 To UBound(a) 
    If Len(Hex(a(i))) = 1 Then 
    inData = inData & "0" & Hex(a(i)) 
    Else 
    inData = inData & Hex(a(i)) 
    End If 
    Next 
    Text2 = inData 
    MSComm1.RThreshold = 1  '打开事件触发
    End Select 
    End Sub 这样做可以避免你再处理OnComm事件是触发该事件。从而带来潜在的一些问题。
      

  4.   

    应该控制是否有后续字节
    MSComm1.RThreshold = 0  '屏蔽事件触发 
      

  5.   

    http://download.csdn.net/source/1262066
    这里有代码,可以借鉴