具有响应的串行连接更新线

时间:2013-03-03 00:11:18

标签: vb.net serial-port newline

我与设备建立了串行连接,但是无法处理来自设备的响应。

如果我使用Hyperterminal并将命令TIME发送到设备,我会得到一个响应;

TIME:13:30:30

将继续在同一行更新。当我尝试使用我的应用程序执行此操作时,根据我是使用RTB还是TB来显示响应,我得到了;

RTB;

TIME:13:30:30
TIME:13:30:31
TIME:13:30:32
TIME:13:30:33
TIME:13:30:34

或TB;

TIME:13:30:30TIME:13:30:31TIME:13:30:32TIME:13:30:33TIME:13:30:34

代码是;

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    ReceivedText(SerialPort1.ReadExisting()) 
End Sub

Private Sub ReceivedText(ByVal [text] As String)
    If Me.RichTextBox1.InvokeRequired Then
        Dim x As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(x, New Object() {(text)})
    Else
        RichTextBox1.AppendText([text])
        TextBox1.AppendText([text])
    End If
End Sub

任何方式我都能得到与使用Hyperterminal时相同的响应?

2 个答案:

答案 0 :(得分:0)

我的方法是将数据累积到StringBuilder,直到您收到包含字段分隔符的事件。然后在字段分隔符中将StringBuilder切成两半,将分隔符之前的所有数据设置为消息框的Text属性,然后继续处理。这样的事情应该做(伪代码跟随)

StringBuilder builder;

SerialPort1_DataReceived()
    receivedData = SerialPort1.ReadExisting()
    builder.Append(receivedData)

    if receivedData contains delimiter
        timeData = builder.ToString().Split(delimiter)
        ReceivedText(timedata[0])
        builder = new StringBuilder(timedata[1])
    end
end

所以我们从串口读取每个调度到我们的缓冲区。如果我们注意到它包含一个新时间值开始的指示符,我们在指标上拆分,设置文本框以包含缓冲区的开头,并清除缓冲区并重新插入其余时间。

在ReceivedText中,你会改变

RichTextBox1.AppendText([text])

RichTextBox1.Text = [text]

对于缺乏VB.NET代码的抱歉,我对语言非常生疏,所以这可能更容易理解。如果您有任何疑问,请告诉我,或者这是否有效。

答案 1 :(得分:0)

确保您的textBox(TB)

textBox1.Multiline = True 
textBox1.AcceptsReturn = True 

由于TB通常用于输入,因此返回可能不是显示,而是用于指示用户输入完成。


追求的可能性较小。

传入数据TIME:13:30:30具有EOLine,CR,LF或CR + LF。 ReadExisting()似乎没有输入数据的任何问题,因此这不太可能是串行数据问题,除了text中潜在的额外/未预见的EOL字符(在CR + LF中) case)和TB / RTB配置为以不同方式处理它们。简单地注意text的预期长度将(in)验证此问题。


注意:
TB“NewLine值从输入缓冲区中删除。”
NewLine的价值在多变。默认为换行符,(NewLine)。