分享

MSCOMM串口控件数据接收方式

 华灯初放l 2012-05-08
MSCOMM串口控件数据接收方式

1
 OnComm 事件中接收数据:
    
这种方式能充分MSCOMM控件的特性。OnComm 事件还可以检查和处理通讯错误;可以通过检查 CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。

   Private Sub MSComm_OnComm ()
       Select Case MSComm1.CommEvent
     
         ' 
错误
         Case comEventBreak ' 
收到 Break
         Case comEventCDTO ' CD (RLSD) 
超时。
         Case comEventCTSTO ' CTS Timeout

         Case comEventDSRTO ' DSR Timeout

         Case comEventFrame ' Framing Error
         Case comEventOverrun '
数据丢失。
         Case comEventRxOver'
接收缓冲区溢出。
         Case comEventRxParity' Parity 
错误。
         Case comEventTxFull '
传输缓冲区已满。
         Case comEventDCB '
获取 DCB] 时意外错误

          ' 
事件
         Case comEvCD ' CD 
线状态变化。
         Case comEvCTS ' CTS 
线状态变化。
         Case comEvDSR ' DSR 
线状态变化。
         Case comEvRing ' Ring Indicator 
变化。
         Case comEvReceive ' 
收到 RThreshold # of chars.
         Case comEvSend ' 
传输缓冲区有 Sthreshold 个字符
 '
         Case comEvEof ' 
输入数据流中发现 EOF 字符


     End Select
   End Sub

2.
轮循法采集数据:
A
、定时器轮循法

    
对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。实际上轮循法最大的好处在于集中处理数据而且不太占用CPU。轮循法要注意定时采集的时间片段大小;这里用二进制收发模式;使属性RThresholdSThreshold0,屏蔽ONCOMM事件。

InputMode = comInputModeBinary
RThreshold = 0
SThreshold = 0

Private Sub TmrComm_Timer()
'
采用轮循法采集数据 
    Dim Rx_buff() As Byte
    Dim okstring As String
    Dim ReceivedLen As Integer

    On Error GoTo ErrorHandler
    TmrComm.Enabled = False '
关闭定时器

    If commport.InBufferCount > 0 Then
          ReceivedLen = commport.InBufferCount
          Rx_buff = commport.Input
          okstring = StrConv(tempbyte, vbUnicode)
          If ReceivedLen = 6 Then 
          If Chr(tempbyte(0)) = ":" And tempbyte(3) = &h0a Then
               ....
           End If
           If Instr(okstring ,":@END*",vbBinaryCompare) Then
                ....
           End If 
     End If
     TmrComm.Enabled = True '
打开定时器
End Sub

B
、直接轮循法
此法用于接收少量控制命令字;
保存输入子串的缓冲区 
Dim Instring As String 
使用 COM1
 
MSComm1.CommPort = 1
' 9600 
波特,无奇偶校验,位数据,一个停止位。

MSComm1.Settings = "9600,N,8,1" 
当输入占用时,
告诉控件读入整个缓冲区。 
MSComm1.InputLen = 0 
打开端口。
 
MSComm1.PortOpen = True
 attention 命令送到调制解调器。
 
MSComm1.Output = "ATV1Q0" & Chr$(13)
确保

调制解调器以"OK"响应。 
等待数据返回到串行端口。
 
Do 
DoEvents
Buffer$ = Buffer$ & MSComm1.Input 
Loop Until InStr(Buffer$, "OK" & vbCRLF)
从串行端口读 "OK" 响应。
 
关闭串行端口。
 
MSComm1.PortOpen = False

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多