这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 串口数据接收方式

共3条 1/1 1 跳转至

串口数据接收方式

助工
2015-02-01 19:22:57     打赏
 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。轮循法要注意定时采集的时间片段大小;这里用二进制收发模式;使属性RThreshold、SThreshold为0,屏蔽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 波特,无奇偶校验,8 位数据,一个停止位。
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


专家
2015-02-04 22:26:21     打赏
2楼
楼主用的是vc吗?

院士
2015-02-08 12:45:10     打赏
3楼
我觉得是visual basic 6.0

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]