Serial port 使用Readline()删除串行端口数据

Serial port 使用Readline()删除串行端口数据,serial-port,readline,Serial Port,Readline,我正在使用串行端口从连接到瘦客户机的秤上读取数据。在99%的情况下,数据被正确读取-即刻度上的任何内容都是应用程序捕获的内容。 然而,有时看起来数据被删除了。例如,它将被读取为0.007,而不是90.007。我正在使用ReadLine函数: private void CaptureWeight() { globalCounter++; string value = ""; _sp.DiscardInBuffer();

我正在使用串行端口从连接到瘦客户机的秤上读取数据。在99%的情况下,数据被正确读取-即刻度上的任何内容都是应用程序捕获的内容。 然而,有时看起来数据被删除了。例如,它将被读取为0.007,而不是90.007。我正在使用ReadLine函数:

private void CaptureWeight()
    {
         globalCounter++;
         string value = "";
         _sp.DiscardInBuffer();

          while (!this._processingDone)
          {
              try
              {                     

                  value = this._sp.ReadLine();                      

                  if (value != "")
                  {
                      if (value == "ES")
                      {
                          _sp.DiscardInBuffer();
                          value = "";
                      }
                      else
                      {
                          this.Invoke(this.OnDataAcquiredEvent, new object[] { value });
                      }
                  }
              }
              catch (TimeoutException)
              {
                  //catch it but do nothing
              }
              catch
              {
                  //reset the port here?
                  MessageBox.Show("some other than timeout exception thrown while reading serial port");
              }
          }
    } //end of CaptureWeight()
“E”什么时候来?理论上,可能是由于调用了DiscardInBuffer(),所以无法正确读取紧跟在“ES”之后的值。如果在此期间缓冲区包含下一次读取的一部分,例如90.007中的9,则9将被丢弃,您将读取0.007

尝试只丢弃最后一个CR LF之前的所有内容。但是请留下不完整的行。

什么时候“ES”来?理论上,可能是由于调用了DiscardInBuffer(),所以无法正确读取紧跟在“ES”之后的值。如果在此期间缓冲区包含下一次读取的一部分,例如90.007中的9,则9将被丢弃,您将读取0.007


尝试只丢弃最后一个CR LF之前的所有内容。但请留下不完整的行。

不要调用DiscardInBuffer。操作系统缓冲区将在数据通过的移入时填充。读取所有数据并据此采取行动,因为在丢弃数据时,您无法知道缓冲区中有什么

不要调用DiscardInBuffer。操作系统缓冲区将在数据通过的移入时填充。读取所有数据并据此采取行动,因为在丢弃数据时,您无法知道缓冲区中有什么

ES是余额发回的错误代码。我想接受错误代码。我的假设是ReadLine读取一行(有意义吗?),因此如果读取ES\n\r,我将吞下它。为什么它不能正确阅读下一行?我将注释掉这篇文章,看看这是否有帮助。不确定,但可能是并发问题-底层线程正在将串行端口数据写入缓冲区,如果发生这种情况,在调用
discardinbuffer()
之前,它没有完成,那么您就失去了开始,例如,90.007ES中的9是余额发回的错误代码。我想接受错误代码。我的假设是ReadLine读取一行(有意义吗?),因此如果读取ES\n\r,我将吞下它。为什么它不能正确阅读下一行?我将对这篇文章进行注释,看看是否有帮助。不确定,但可能是并发性问题-底层线程正在将串行端口数据写入缓冲区,如果发生这种情况,在调用
DiscardInBufer()
之前,它没有完成一个任务,那么您就失去了开始,例如90.007中的9将无法工作。我清除缓冲区中的数据,以便读取的数据与样本的datagrid匹配。如果用户多次按Print,则无法识别哪个重量属于哪个样本,因此每次读取时我都会清除缓冲区b4。在readline之后调用DiscardInBuffer()更好吗?+1-我同意:不要调用DiscardInBuffer。如果用户按Print的次数太多,您将不得不以其他方式处理它。正如上面所写的,你总是在港口赛跑,看谁先到达那里。这是行不通的。我清除缓冲区中的数据,以便读取的数据与样本的datagrid匹配。如果用户多次按Print,则无法识别哪个重量属于哪个样本,因此每次读取时我都会清除缓冲区b4。在readline之后调用DiscardInBuffer()更好吗?+1-我同意:不要调用DiscardInBuffer。如果用户按Print的次数太多,您将不得不以其他方式处理它。正如上面所写的,你总是在港口赛跑,看谁先到达那里。