我正在开发一个软件,它读取通过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++;
}
提前致谢。
答案 0 :(得分:4)
无法保证您将获得数据的大小......
它可以一次获得角色,或者一次获得几个角色。
通常,永远不要依赖于时间来计算逻辑“块”(在您的情况下,数字)之间的差异。而是创建一个可以解释的协议。
在你的情况下,如果你有一个非常简单的协议,你发送一个[空格]号[空格]号码然后你可以解析
...例如
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++;
}
如果您使用123,123,234,123,343 \ 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++;
}
答案 1 :(得分:2)
您可能获得的数据量比预期的要少。如果你现在应该在你的块中有多少数据,你应该使用一些缓冲区来保留不完整的块并等待剩余的块。当块完成后,你应该继续使用AddDataToGraph(zedGraph,howfar,newRead)。