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方式才搞定
不知道为什么会这样 --------------------编程问答--------------------
串口通信不至于一定非得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 , 基础类