C#串行读取错误

C#串行读取错误,c#,serial-port,buffer,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); te

我正在开发一个软件,它读取通过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]数字[space]数字,那么您可以解析出来

例如

如果您使用的是123234343\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++;
    }

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

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

一般来说,永远不要依赖时间来计算逻辑“块”(在你的例子中是数字)之间的差异。而是创建一个可以解释的协议

在您的情况下,如果您有一个非常简单的协议,其中您发送一个数字[space]数字[space]数字,那么您可以解析出来

例如

如果您使用的是123234343\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++;
    }

您可能得到的数据块比您预期的要小。如果您现在知道块中应该包含多少数据,那么应该使用一些缓冲区来保留不完整的块,并等待剩余的块。块完成后,您应该继续使用AddDataToGraph(zedGraph、howfar、newRead)。

您可能得到的数据块比您预期的要小。如果您现在知道块中应该包含多少数据,那么应该使用一些缓冲区来保留不完整的块,并等待剩余的块。区块完成后,您应该继续使用AddDataToGraph(zedGraph、howfar、newRead)。

+1。不过,请注意,这只会在收到以下空格时解析每个数字-因此,例如,如果发送方向您发送一个类似“1 2 3 4”的字符串,此代码将解码“1 2 3”,然后等待空格-它将永远不会将“4”添加到图形中。这对您来说可能不是一个问题,但值得记住。有时可以合理地使用时间来分离数据,特别是当数据项之间的时间相对于可能遇到的最长潜在“停顿”而言非常长时。例如,假设一个设备每秒发送一个数据块,并且一个数据块中的数据保证间隔不超过100ms。一些代码观察到没有数据,检查时间,观察到一段时间后至少已经过了250ms,然后观察到仍然没有数据。在这种情况下,代码可以假定暂停后的数据是新块的一部分。在许多情况下,将基于时间的解码与其他解析结合起来可能会有所帮助。例如,假设每个可变长度数据记录前面都有某个字符,但没有任何尾随字符。可以说,输入号码可以通过前缀字符终止,也可以通过在确定的时间长度内缺少数据终止。如果运行接收代码的计算机执行2级垃圾收集或其他导致打嗝的操作,它可能会看到多个记录背靠背,并且无法看到它们之间的任何时间,但仍然可以分离这些记录。是否可以缓冲serialport,直到给出换行符(ASCI 10)为止?我可以创建一个协议,该协议将给出几个用逗号分隔的值,然后以换行符结尾。+1。不过,请注意,这只会在收到以下空格时解析每个数字-因此,例如,如果发送方向您发送一个类似“1 2 3 4”的字符串,此代码将解码“1 2 3”,然后等待空格-它将永远不会将“4”添加到图形中。这对您来说可能不是一个问题,但值得记住。有时可以合理地使用时间来分离数据,特别是当数据项之间的时间相对于可能遇到的最长潜在“停顿”而言非常长时。例如,假设一个设备每秒发送一个数据块,并且一个数据块中的数据保证间隔不超过100ms。一些代码观察到没有数据,检查时间,观察到一段时间后至少已经过了250ms,然后观察到仍然没有数据。在这种情况下,代码可以假定暂停后的数据是新块的一部分。在许多情况下,将基于时间的解码与其他解析结合起来可能会有所帮助。例如,假设每个可变长度数据记录前面都有某个字符,但没有任何尾随字符。可以说,输入号码可以通过前缀字符终止,也可以通过在确定的时间长度内缺少数据终止。如果运行接收代码的机器执行2级垃圾收集或其他导致故障的事情,它可能会看到几个记录背靠背出现,并且无法在它们之间看到任何时间,但仍可以分离记录。是否可以缓冲serialport,直到给出linefeed(ASCI 10)?我可以创建一个协议,该协议将给出几个用逗号分隔的值,然后以换行符结束。