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
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
解决方案 »
- 怎么获得选择的文件名并打开?
- 下个月去北京旅游,已定,问问天气和其他。
- VB设计程序做UI设计后查询速度明显变慢怎么办呢?
- 初学VB 3天菜鸟问题很幼稚大家帮帮我谢谢。
- 如果动态的根据窗体名,生成新的窗体实例,如Set frm=new "Form1"
- ********如何编程控制开通长途和市话?********
- 找遍了所有的贴子竟然没有答案~请大家近来看一下吧!关于时间字段,时间不是日期!在线等待,给于提示就给分
- 求助,关于timer的问题。。。
- 这样的程序VB怎么可以做到
- Windows的传真功能或WinFax传真软件:发一个传真究竟如何收费?
- VB 用WINSOCK API 编写服务端如何响应客户端的Connect事件和send事件?
- VB 调用JAVAScript脚本函数
停止串口事件不要用mscomm.inputlen=0,改成msconmm.Rthreshold =0
停止串口事件不要用mscomm.inputlen=0,改成msconmm.Rthreshold =0
这句在打开串口的时候有没有调用呢?前几天写一个串口接收程序,测试的时候试验了好几台电脑都没问题,唯独放到生产用的机器上就收不到任何数据。
后来把MSComm控件扔掉,换成API方式才搞定
不知道为什么会这样
MSComm控件的RThreshold属性为不等于0的正数,其次要接收0X13和0X11等文本不能显示的字符
如yachong所说:
MSComm.InputMode = comInputModeBinary
按2进制方式接收,接收后处理为16进制字符串来做数据处理.
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的功能。