C#串行读取错误
本文关键字:取错误 读取 | 更新日期: 2023-09-27 18:21:16
我正在开发一个软件,它读取通过COM端口发送的数据,并在实时图形和文本框中显示值(用于调试)。一开始读起来不错,但后来突然其中一个数字被一分为二。像这样:
63-64-65-66-67-6-8-69-70-80
应该是68。这使得图表完全错误!
这是什么原因造成的?
我的代码如下:
private void DisplayText(object sender, EventArgs e)
{
textBox1.AppendText(RxString);
textBox1.AppendText(" - ");
}
private void comPort_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
{
RxString = comPort.ReadExisting();
this.Invoke(new EventHandler(DisplayText));
newRead = Convert.ToDouble(RxString);
AddDataToGraph(zedGraph, howfar, newRead);
howfar++;
}
提前谢谢。
无法保证您将获得多大的数据块。。。。
它可以一次给他们一个字符,或者一次给几个字符。
一般来说,永远不要依赖时间来计算逻辑"块"(在您的情况下,是数字)之间的差异。相反,创建一个可以解释的协议。
在你的情况下,如果你有一个非常简单的协议,你发送一个号码[space]number[space]number,那么你就可以解析出
例如。。。
RxString += comPort.ReadExisting(); // add to an existing string
if(RxString.Contains(" ") // ok, there is a space, so we can parse out a number
{
// parse...
newRead = Convert.ToDouble(RxString.Substring(0,RxString.IndexOf(" "));
RxString = RxString.Remove(0,RxString.IndexOf(" ")+1;
AddDataToGraph(zedGraph, howfar, newRead);
howfar++;
}
如果您使用的是123123234123343''n
RxString += comPort.ReadExisting(); // add to an existing string
if(RxString.Contains("'n") // ok, there is a linefeed, so we can parse out all the numbers
{
// parse...
var line = RxString.Substring(0, RxString.IndexOf("'n"));
var values = line.Split(new char[] {','}, StringSplitOptions.None).ToList();
values.ForEach(v => AddDataToGraph(zedGraph, howFar, Convert.ToDouble(v)));
RxString = RxString.Remove(0, RxString.IndexOf("'n"));
howfar++;
}
您得到的数据块可能比预期的要小。如果您现在知道块中应该有多少数据,那么应该使用一些缓冲区来保留不完整的块,并等待剩余的块。当chunk完成后,您应该继续使用AddDataToGraph(zedGraph,howfar,newRead)。