当前位置:编程学习 > VB >>

VB MSCOMM二进制接收 收不到0X13和0X11

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 Sub

Function ErrComm()
    Dim temCom
    temCom = MSComm.Input
    MSComm.InBufferCount = 0
End Function --------------------编程问答-------------------- 光看这段代码看不出,但是建议把串口设置放到串口初始化里面,不要临时改变接受类型这些设置
停止串口事件不要用mscomm.inputlen=0,改成msconmm.Rthreshold =0 --------------------编程问答-------------------- 光看这段代码看不出,但是建议把串口设置放到串口初始化里面,不要临时改变接受类型这些设置
停止串口事件不要用mscomm.inputlen=0,改成msconmm.Rthreshold =0 --------------------编程问答-------------------- MSComm.InputMode = comInputModeBinary
这句在打开串口的时候有没有调用呢?

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

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

串口通信不至于一定非得API才能搞定.用MSComm控件出问题多半在接收上的代码存在缺陷.

LZ使用MSComm控件的OnComm事件接收,必须在MSComm控件初始化时设置
MSComm控件的RThreshold属性为不等于0的正数,其次要接收0X13和0X11等文本不能显示的字符
如yachong所说:
MSComm.InputMode = comInputModeBinary 
按2进制方式接收,接收后处理为16进制字符串来做数据处理.
--------------------编程问答-------------------- 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 Sub

Private Sub MSComm_OnComm()
Select Case MSComm.CommEvent  
Case comEvReceive
col.add MSComm.Input   '将收到的数据保存到collection
end select

Private Sub Timer1_Timer()
    '对collection里缓存的数据进行分析处理
     '将已处理的数据从collection中删除
End Sub

核心思想就是在OnComm时先将收到的数据保存到Collection里面,再用Timer定时对Collection里的数据进行分析和处理。如果你会用VB的多线程,可以再开一个线程替代Timer的功能。

补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,