robi 发表于 2011-3-31 21:03:06

求助:VB6.0 MSComm控件串口通信发送循环

项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:

当发送命令"H!i"时,为寻找芯片。
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息

当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据
没有错误时,设备返回:0630
此时,发送命令“STX”,或十六进制命令“02”
设备返回前十六字节数据

之后继续发送命令“H!i”,寻找下一个芯片
--------------------------------------------------------------------
项目用MSComm进行串口通信
需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
----------------------------------------------------------------------------
其实程序说简单些就是:
发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据
这个循环要怎么实现呢?
先谢谢各位!

--------------------------------------------------------------------
下面是循环部分的代码。系统报错
Private Sub cmdStart_click()
    Timer1.Enabled = True
   
   
   
End Sub
Private Sub timer1_timer()
   
   MSComm1.OutBufferCount = 0 '先清空缓存
   sendbuffer = "H!i"
   MSComm1.Output = sendbuffer
End Sub
'结束
Private Sub cmdStop_click()
    Timer1.Enabled = False
    Timer2.Enabled = False
    Timer3.Enabled = False
End Sub

'接收数据
Private Sub MSComm1_oncomm()
    Dim inbyte() As Byte
    Dim revbuffer As String
    Dim a, i, b
    Select Case MSComm1.CommEvent
       '如果有CT在感应区
      
      Case comEvReceive
            inbyte = MSComm1.Input
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
                revbuffer = revbuffer + Hex(inbyte(i))
            Next i
            txtHex.Text = revbuffer
            If Mid(revbuffer, 1, 6) = "480310" Then
                Timer1.Enabled = False
                Timer1.Enabled = True
            End If
      End Select
      Case comEvSend
    End Select
Private Sub timer2_timer()
      MSComm1.OutBufferCount = 0 '先清空缓存
      sendbuffer = "R00000016U"
      MSComm1.Output = sendbuffer
End Sub
Private Sub MSComm1_oncomm()
    Select Case MSComm1.CommEvent
      Case comEvReceive
      inbyte = MSComm1.Input
      For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
            revbuffer = revbuffer + Hex(inbyte(i))
      Next i
      txtHex.Text = revbuffer
      If Mid(revbuffer, 1, 4) = "6030" Then
            Timer2.Enabled = False
            Timer3.Enabled = True
      End If
      Case comEvSend
    End Select
End Sub
Private Sub timer3_timer()
    MSComm1.OutBufferCount = 0 '先清空缓存
    sendbuffer = "STX"
    MSComm1.Output = sendbuffer
    Select Case MSComm1.CommEvent
      Case comEvReceive
            inbyte = MSComm1.Input
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
                revbuffer = revbuffer + Hex(inbyte(i))
            Next i
            txtHex.Text = revbuffer
            Case comEvSend
    End Select
End Sub



无能 发表于 2011-4-1 09:22:34

这个问题感觉不难,但你描述的有些乱,让人看不明白。
我也用Vb编过一些东西,欢迎交流。

无能 发表于 2011-4-6 16:50:39

不知解决的如何了?三个Timer确实很混乱。

robi 发表于 2011-4-6 22:47:31

回复 无能 的帖子

快了。
设备通信协议我没看清,这个设备的通信不用timer。

1393065141 发表于 2011-5-4 22:34:47

学习、、、、、、、、、、、、、、、、、、、、

robi 发表于 2011-8-15 20:09:08

后来发现其实这个通信程序的关键在于要弄清收发信息的格式,也就是MSComm初始设置时,是二进制还是文本。这个很重要,否则通信会出错。

机械电气编程 发表于 2012-11-15 11:31:42

让我想起了,我毕业论文就搞的这个。
页: [1]
查看完整版本: 求助:VB6.0 MSComm控件串口通信发送循环