1

我有一个与设备的串行连接,但无法处理来自设备的响应。

如果我使用超级终端并将命令发送TIME到设备,我会得到如下响应;

TIME:13:30:30

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

实时出价;

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

或结核病;

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

有什么方法可以得到与使用超级终端时相同的响应?

4

2 回答 2

0

我的方法是将数据累积到 a 中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 代码表示歉意,我对这种语言很生疏,所以这可能更容易理解。如果您有任何问题,或者这是否有效,请告诉我。

于 2013-03-05T18:50:42.647 回答
0

确保您的文本框 (TB) 有

textBox1.Multiline = True 
textBox1.AcceptsReturn = True 

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


不太可能的追求途径。

传入的数据TIME:13:30:30有一个 EOLine,可以是 CR、LF 或 CR+LF。 ReadExisting()输入数据似乎没有任何问题,因此这不太可能是串行数据问题,除了一个额外/意外的 EOL 字符可能潜伏在text(在 CR + LF 情况下)并且 TB/RTB 配置为处理他们不同。简单地注意到text将(in)验证这个问题的预期长度。


注释:
TB“从输入缓冲区中删除了 NewLine 值。”
NewLine 的值是可变的。默认为换行符 (NewLine)。

于 2013-06-20T12:28:56.367 回答