Private Sub MSComm_OnComm()
    Dim agdda As Integer
    Dim rxUSART As String
    Dim abde As Byte
    Dim Amn As Integer
    Dim iiiii As Integer
    Dim RX_buff() As Byte
    Select Case MSComm.CommEvent
        '--------------------------------------------------------------
        '错误事件
        Case comEventBreak: Call ErrComm                                ' 收到 Break。
        Case comEventCDTO: Call ErrComm                                 ' CD (RLSD) 超时。
        Case comEventCTSTO: Call ErrComm                                ' CTS Timeout。
        Case comEventDSRTO: Call ErrComm                                ' DSR Timeout。
        Case comEventFrame: Call ErrComm                                ' Framing Error
        Case comEventOverrun: Call ErrComm                              '数据丢失。
        Case comEventRxOver: Call ErrComm                               '接收缓冲区溢出。
        Case comEventRxParity: Call ErrComm                             'Parity 错误。
        Case comEventTxFull: Call ErrComm                               '传输缓冲区已满。
        Case comEventDCB: Call ErrComm                                  '获取 DCB 时意外错误
        Case comEvCD                                    ' CD 线状态变化。
        Case comEvCTS                                   ' CTS 线状态变化。
        Case comEvDSR                                   ' DSR 线状态变化。
        Case comEvRing                                   ' Ring Indicator 变化。
        Case comEvEOF
        Case comEvReceive                               '收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。
            MSComm.RThreshold = 0: MSComm.InputLen = 0  '暂停串口中断
            Dim i As Integer
            Sleep (200)
            rxUSART = ""
            MSComm.InputMode = comInputModeBinary   '设置接收数据模式为二进制形式
            RX_buff = MSComm.Input
            For i = 0 To UBound(RX_buff)
                abde = RX_buff(i)
                'abde = Right("0" & Hex(RX_buff(i)), 2)                If Len(Hex$(RX_buff(i))) = 1 Then
                    rxUSART = rxUSART & "0" & Hex$(RX_buff(i)) & " "
                Else
                    rxUSART = rxUSART & Hex$(RX_buff(i)) & " "
                End If
'rxUSART 怎么弄都收不到0X11t 2
            Next
    End Select
  '  Sleep (500)
  '  RX_buff = MSComm.Input
    MSComm.RThreshold = N_Byte
End SubFunction ErrComm()
    Dim temCom
    temCom = MSComm.Input
    MSComm.InBufferCount = 0
End Function

解决方案 »

  1.   

    光看这段代码看不出,但是建议把串口设置放到串口初始化里面,不要临时改变接受类型这些设置
    停止串口事件不要用mscomm.inputlen=0,改成msconmm.Rthreshold =0
      

  2.   

    光看这段代码看不出,但是建议把串口设置放到串口初始化里面,不要临时改变接受类型这些设置
    停止串口事件不要用mscomm.inputlen=0,改成msconmm.Rthreshold =0
      

  3.   

    MSComm.InputMode = comInputModeBinary
    这句在打开串口的时候有没有调用呢?前几天写一个串口接收程序,测试的时候试验了好几台电脑都没问题,唯独放到生产用的机器上就收不到任何数据。
    后来把MSComm控件扔掉,换成API方式才搞定
    不知道为什么会这样
      

  4.   

    串口通信不至于一定非得API才能搞定.用MSComm控件出问题多半在接收上的代码存在缺陷.LZ使用MSComm控件的OnComm事件接收,必须在MSComm控件初始化时设置
    MSComm控件的RThreshold属性为不等于0的正数,其次要接收0X13和0X11等文本不能显示的字符
    如yachong所说:
    MSComm.InputMode = comInputModeBinary 
    按2进制方式接收,接收后处理为16进制字符串来做数据处理.
      

  5.   

    1、
    MSComm.InputMode = comInputModeBinary  '设置接收数据模式为二进制形式
    这句应该在PortOpen之前设置,而不是等收到数据以后才设置2、
    Case comEvReceive    '收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。 
    MSComm.RThreshold = 0: MSComm.InputLen = 0  '暂停串口中断 
    Dim i As Integer 
    Sleep (200) 
    处理方法不当,如果实际数据长度等于Rthreshold设置,sleep(200)属于浪费时间;如果实际数据长度超过Rthreshold设置,200毫秒时间又可能不够。建议用Collection来缓存接收到的数据,将数据接收和数据处理分开来进行,比如:dim col as collection Private Sub Form_Load()
    set col=new collection
    mscomm.RThreshold=1    '收到一个字节即触发OnComm事件
    End SubPrivate Sub MSComm_OnComm()
    Select Case MSComm.CommEvent  
    Case comEvReceive
    col.add MSComm.Input   '将收到的数据保存到collection
    end selectPrivate Sub Timer1_Timer()
        '对collection里缓存的数据进行分析处理
         '将已处理的数据从collection中删除
    End Sub核心思想就是在OnComm时先将收到的数据保存到Collection里面,再用Timer定时对Collection里的数据进行分析和处理。如果你会用VB的多线程,可以再开一个线程替代Timer的功能。