在串行端口

时间:2016-07-19 18:24:42

标签: vb.net serial-port

我尝试向设备发送命令并通过串口读回数据,但它给了我一个奇怪的行为。我必须发送几次(最多两次)sendData()来获取数据。我不想使用writeLine,我不在我的代码中写一个循环(我已经想到了)。我的架构就是这样的。我将ReceivedByteThreshold设置为1,这样每次从设备接收数据时,都会触发ReceivedData事件处理程序。我一次读一个字节。当它读取其ascii为13的CR时,我在标签上显示数据,但我必须多次发送数据(* idn?)(有时可以一次完成但不一致)。参见图片以供参考。我不确定为什么会这样。提前谢谢

Private Sub DataReceived(sender As Object, e As     IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    Dim ret As Integer
    ret = SerialPort.ReadByte()

    If ((ret <> 13) And (ret <> 10)) Then
        str &= System.Convert.ToChar(ret)
    End If

    If ret = 13 Then
        ret = SerialPort.ReadByte()
        If ret = 10 Then
            Me.Label2.Text = str
            str = ""
        End If

    End If


End Sub


Sub SendData(ByVal data As String)
    Try
        SerialPort.Write(data)

    Catch ex As Exception
        MsgBox("fail to send data")
    End Try
End Sub

enter image description here

[更新]

我改变了方法。我刚刚使用了Do循环但结果仍然不一致。我选择不再使用计时器,只是使用ReceiveData事件处理程序。

Private Sub DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    Dim ret As Integer
    Do
        ret = SerialPort.ReadByte()

        str &= System.Convert.ToChar(ret)
        If ret = 13 Then
            ret = SerialPort.ReadByte()

            If ret = 10 Then

                Exit Do
            End If

        End If

    Loop

    Me.Label2.Text = str
    str = ""

End Sub

我使用Docklight来测试我的代码,你可以告诉它有时会在重新获取数据之前连续发送两次。如果涉及竞争条件问题我不是,谢谢。

enter image description here

0 个答案:

没有答案