C#串口读错误

时间:2012-01-23 22:54:18

标签: c# serial-port buffer

我正在开发一个软件,它读取通过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++;


    }

提前致谢。

2 个答案:

答案 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)。