【问题标题】:Serial port dropping data with Readline()使用 Readline() 丢弃数据的串口
【发布时间】:2009-03-10 17:12:15
【问题描述】:

我正在使用串行端口从连接到瘦客户端的秤上读取数据。在 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()

【问题讨论】:

    标签: serial-port readline


    【解决方案1】:

    不要调用 DiscardInBuffer。当数据通过UART 移入时,操作系统缓冲区被填充asynchronously。读取所有数据并采取相应措施,因为在丢弃缓冲区时您无法知道缓冲区中的内容!

    【讨论】:

    • 那行不通。我清除了 In 缓冲区,以便读取的数据与样本的数据网格相匹配。如果用户按打印太多次,则无法 2 识别哪个重量属于哪个样本,因此我每次读取都清除缓冲区 b4。在 readline 之后调用 DiscardInBuffer() 会更好吗?
    • +1 - 我同意:不要调用 DiscardInBuffer。如果用户按 Print 太多次,您将不得不以其他方式处理它。如上所述,您总是在港口比赛,看谁先到达。
    【解决方案2】:

    “ES”什么时候来?理论上,“ES”之后的值可能无法正确读取,因为您调用了 DiscardInBuffer()。如果在那个时候缓冲区包含下一个读数的一部分,例如9 在 90.007 中,9 被丢弃,你读到 0.007。

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

    【讨论】:

    • ES 是天平发回的错误码。我想吞下错误代码。我的假设是 ReadLine 读取一行(有意义吗?),所以如果 ES\n\r 被读取,我会吞下它。为什么它不能正确读取下一行?我会注释掉这篇文章,看看是否有帮助。
    • 不确定,但可能是并发问题 - 底层线程正在将串行端口数据写入缓冲区,如果发生这种情况,在您调用 DiscardInBufer() 之前它没有完成,你只是失去了开始,例如90.007 中的 9
    猜你喜欢
    • 2015-10-09
    • 2011-11-02
    • 2010-11-20
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多