这是小弟写的一个简单的串口接受一串16进制数的程序
其中在属性栏设置settings=19200,n,8,1;RThreshold=1;SThreshold=1
                InputLen=0;InputMode=1Private Sub MSComm1_OnComm()
    Dim wyh As String
    Dim buffer As Variant
    Dim i As Integer    
   Select Case MSComm1.CommEvent
        Case comEvCD
        Case comEvCTS
        Case comEvDSR
        Case comEvRing
        Case comEvReceive
            buffer = MSComm1.Input
            For i = LBound(buffer) To UBound(buffer)
                If Len(Hex(buffer(i))) = 1 Then
                    Text1.Text = Text1.Text & "0" & Hex(buffer(i)) & Chr(32)
                Else
                    Text1.Text = Text1.Text & Hex(buffer(i)) & Chr(32)
                End If
            Next i
            wyh = Text1.Text
        Case comEvSend        
    End Select
    MSComm1.OutBufferCount = 0
    MSComm1.InBufferCount = 0
End Sub你用串口调试助手向串口输入一串16进制数看看(大于14个).1,全速运行,看结果 (正确)2,全速运行,并多次向串口发送数据(10次以上),看结果(第十次以前正确,以后发现只能收到前14个)3,单步运行,看结果  (正确)4,在监视窗口监视 mscomm1.input ,然后单步运行,看结果  (一个收不着)5,在 buffer = MSComm1.Input这条语句后面的任何语句上设置断点,然后运行,看结果  (发现只能收到前14个)以上5种情况出现的结果怎么这样?我的程序或设置哪有错么?求解!

解决方案 »

  1.   

    先试试,最后这两句不要
        MSComm1.OutBufferCount = 0
        MSComm1.InBufferCount = 0
    这两句我没有用过,但看字面应该是清空缓冲区的吧。
    你设置的是串口收到一个字符即触发事件。
    当串口接收事件被触发,你用 input接收时,这时对方发送过来的数据还没有完全到达,所以你用input只能收到一部分,你能收到14个,已经不错了,我这里有时一次能收到的更少。
    而你通过input接收数据后,进行处理。在处理过程中,可能串口又收到了剩余的几个字符。
    而你后面把缓冲区清掉了,当然就收不到了。
    所以,去掉这两句,你可能一次发送的16个会在两次事件中收到。
      

  2.   

    2楼说的没错
        MSComm1.OutBufferCount = 0
        MSComm1.InBufferCount = 0
    这两句是为了清空缓冲区的,如果不清空的话,确实是可以在第二次事件中收到
    但我现在需要它一次收完,因为每次需要接收的字符不一样,我检测接收到的头几个字符从而判断到底是哪些用途!3楼的话,因为接收的16进制字符串未知,且是变化的,所以我也没法把它固定的!因此,我也不知道该如何办才好!
      

  3.   

    你连接的产品发送的不同指令应该有相同的起始和结尾吧如果有起始符和结尾符,那么你可以自己建一个字符串变量作为缓冲区。
    每次收到的东西都往这个字符串添加,然后查找里面是否存在起始和终止配对。
    如果找到配对,则将其中间的字符串取出来,通过事件啊,其他方式发出来。
    这样外面的程序收到这个字符串就是完整的。
    我接收Sick的条码扫描器输出的条码就是这样处理的。如果没有开始和结束符,那就按楼上的这个办法了