【发布时间】:2020-10-08 10:51:35
【问题描述】:
我正在创建一个与不断发送数据的串行设备通信的程序。我每 100 毫秒从设备读取一次数据(使用计时器)。我使用port.ReadExisting() 从设备接收所有当前可用的数据,然后尝试将其拆分为行,因为我需要检查一些接收到的数据,而最好的方法是检查行。当设备发送不以"\r\n" 或'\n' 结尾的数据时会出现此问题。
在完美的情况下port.ReadExisting() 返回:"sampletext\r\nsomesampletext\nsampletext\r\n
但是当结尾没有 CR 或 LF 字符时会出现问题:
port.ReadExisting() 第一次返回这个:"text\nsamp"
第二次port.ReadExisting()返回:letext\r\ntext\r\n"
最终结果应如下所示:
text
sampletext
text
但我得到的是这样的:
text
samp
letext
text
我的代码:
这是timer,每 100 毫秒运行一次:
private void CommandTimer_Tick(object sender, EventArgs e)
{
BackgroundWorker seriaDataWorker = new BackgroundWorker();
seriaDataWorker.DoWork += (obj, p) => PrintSerialData();
seriaDataWorker.RunWorkerAsync();
}
BackgroundWorker 被定时器调用:
private void PrintSerialData()
{
try
{
if (RandomReboot)
{
RebootWatch.Start();
}
if (COMport.IsOpen)
{
if (COMport.BytesToRead != 0)
{
SerialPrint(COMport.ReadExisting());
}
}
}
catch (System.IO.IOException SerialException)
{
return;
}
}
将接收到的数据解析成行的函数:
private void SerialPrint(string data)
{
using (var buffer = new StringReader(data))
{
string line = "";
while((line = buffer.ReadLine()) != null)
{
if (CheckForAnsw)
{
ReceivedCommandData = line;
if (ReceivedCommandData.Contains(AnswExpected))
{
ReceivedAnsw = true;
ReceivedLine = ReceivedCommandData;
ReceivedCommandData = "";
}
}
this.Invoke(new MethodInvoker(delegate
{
AppendText(TextBox_System_Log, Color.Black, line + "\r\n");
}
));
}
}
}
我知道问题在于buffer.ReadLine() 将不以 CR 或 LF 字符结尾的字符串的其余部分视为单独的行,但我不知道如何修复它。
我过去曾尝试使用port.ReadLine(),但它速度较慢,并且在串行端口断开连接等时会给我带来问题。
【问题讨论】:
-
您是否尝试将数据附加到
TextBox_System_Log而不是自己解析?如果是,出了什么问题? -
@Ackdari 如果我只是将它附加到
TextBox_System_Log没有问题,但正如我所说,这个应用程序需要检查接收到的数据并将 ir 与给定的答案或其他数据进行比较,这就是我需要拆分它的原因成行。 -
我经常看到这个问题,我已经回答了很多。这里有一篇很好的文章:stackoverflow.com/a/59203139/2009197
标签: c# .net string serial-port