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++;

    }

提前谢谢。

C#串行读取错误

无法保证您将获得多大的数据块。。。。

它可以一次给他们一个字符,或者一次给几个字符。

一般来说,永远不要依赖时间来计算逻辑"块"(在您的情况下,是数字)之间的差异。相反,创建一个可以解释的协议。

在你的情况下,如果你有一个非常简单的协议,你发送一个号码[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)。