我与设备建立了串行连接,但是无法处理来自设备的响应。
如果我使用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时相同的响应?
答案 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)。