如果已经要接收的字符数,可以很方便地用comEvReceive来接收,问题是,如果我的数据长度是未知的,要如何接收?
比如,我发一“AAA“指令过去,返回为3字符“xxx”;接着我发一“BBB”过去,返回为"yyy…yDD",其中DD是数据结束标志,该段程序如何写?
另外,我使用comEventBreak来提示“设备断电”,以前可以正常使用,但最近时而灵时而不灵的,怎么回事呢?该用什么代码来判断呢?我不想再发查询指令过去,因为担心会打扰我的其他指令。Private Sub cmdCommEvent_Click()
    MSComm1.RThreshold = 3
    Me.MSComm1.Output = “AAA”
End SubPrivate Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
        Case comEventBreak
            MsgBox "设备断开连接!"
            End
        Case comEvReceive
            txtT.Text = Me.MSComm1.Input
    End Select
End Sub

解决方案 »

  1.   

    再接着请教一个问题,我想把ESC定义为公共变量,要怎么定义,用Const ESC=Chr(27)并放在Form最开始时会出错。
    Dim ESC As String: ESC = Chr(27)
      

  2.   

    Private Sub cmdCommEvent_Click()
        txtT.Text = vbnullstring '<-
        MSComm1.RThreshold = 3
        Me.MSComm1.Output = “AAA”
    End SubPrivate Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEventBreak
                MsgBox "设备断开连接!"
                End
            Case comEvReceive
                txtT.Text = txtT.Text & Me.MSComm1.Input '<-
        End Select
    End Sub
      

  3.   

    问题是,我发“BBB”时,数据长度是未知的,只知道数据结尾是“DD”,并且前后两次的数据最好分开,不要混在一起,要怎么写?
      

  4.   

    纯 VB 的做法:
    Public Property Get ESC() As String
        ESC = Chr$(27)
    End Property
    或者自己做一个 tlb,里面定义常量。
      

  5.   

    再补充一下,最好的情况就是:当我发送“AAA”后,确定已接收3字符"xxx“,我才发"BBB"。
      

  6.   

    Private Sub cmdCommEvent_Click()
        txtT.Text = vbnullstring '<-发送前向文本框清除,两次发送的回复不会混合
        MSComm1.RThreshold = 1 '<-回复长度未知,就逐个字符接受
        Me.MSComm1.Output = “AAA”
    End SubPrivate Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEventBreak
                MsgBox "设备断开连接!"
                End
            Case comEvReceive
                txtT.Text = txtT.Text & Me.MSComm1.Input '<-本次回复的所有字符拼接起来
        End Select
    End Sub
      

  7.   

    你自己记录上次发送的是什么命令,然后在 Case comEvReceive 下根据规则判断是否接收完成。
      

  8.   

    如果是单次发送命令,这种方式可以很好的解决。但我是先发送AAA,得到确认后,再发送BBB。
    即:
    Click事件中:
    发送AAA
    等待xxx
    获得xxx后,发送BBB,
    等待yyy……yDD
      

  9.   


    Option Explicit
        Dim strData As StringPrivate Sub Command1_Click()
        MSComm1.Output = "AAA"
    End SubPrivate Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.RThreshold = 1
        MSComm1.PortOpen = True
    End SubPrivate Sub MSComm1_OnComm()
        Dim sj As String
        Select Case MSComm1.CommEvent
            Case 2
                sj = MSComm1.Input
                strData = strData & sj
                If Mid(strData, 1, 3) = "xxx" Then
                    MSComm1.Output = "BBB"
                    strData = ""
                ElseIf Right(strData, 2) = "DD" Then
                    Text1 = strData
                    strData = ""
                End If
        End Select
    End Sub
      

  10.   

    嗯,zdingyun的方法不错,但仅解决了发送两个命令的问题,但如果我是发送多个命令呢,每发送一个命令,我都要等待它的返回;得到返回后,再发送下一命令,即主程序间断的等待。
    发送AAA 
    等待xxx 
    获得xxx后,发送BBB, 
    等待yyy……yDD
    发送CCC
    等待
    发送DDD
    ……
      

  11.   

    Option ExplicitPrivate m_DeviceError As Boolean
    Private m_Receive As StringPrivate Function SendAndReceive(ByVal cmd As String) As Boolean
        Dim bAllReceive As Boolean
        
        m_DeviceError = False
        m_Receive = vbNullString
        
        MSComm1.Output cmd
        
        While Not bAllReceive
            DoEvents
            If m_DeviceError Then Exit Function
            
            Select Case cmd
                Case "AAA"
                    If Len(m_Receive) = 3 Then bAllReceive = True
                Case "BBB"
                    If Right$(m_Receive, 2) = "DD" Then bAllReceive = True
                case ... '<-根据不同的发送命令和规则判断接收是否完成
            End Select
        Wend
        txtT.Text = txtT.Text & m_Receive & vbCrLf
        
        SendAndReceive = True
    End FunctionPrivate Sub cmdCommEvent_Click()
        txtT.Text = vbNullString
        MSComm1.RThreshold = 1
        
        If Not SendAndReceive("AAA") Then Exit Sub
        If Not SendAndReceive("BBB") Then Exit Sub
        ...
    End SubPrivate Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEventBreak
                m_DeviceError = True
                MsgBox "设备断开连接!"
                End
            Case comEvReceive
                m_Receive = m_Receive & Me.MSComm1.Input
        End Select
    End Sub
      

  12.   

    直接使用的MSComm,也没用什么协议。
    算了,结贴吧,以后想想有什么好的办法。