15

我正在从串口读取数据。数据超出规模。即使Readline()在删除DiscardInBuffer().

从串口读取数据的正确方法是什么?网上的例子太少了,我觉得这就像一个没有人发现的圣杯。

C#、WinCE 5.0、HP 瘦客户端、Compact 框架 2.0

 private void WeighSample()
    {
        this._processingDone = false;
        this._workerThread = new Thread(CaptureWeight);
        this._workerThread.IsBackground = true;
        this._workerThread.Start();
    } //end of WeighSample()


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


          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()

关于我的应用程序要注意的一件事是,当光标跳到文本框上时,我启动了线程 (weighSample)。原因是重量也可以手动输入(部分要求)。所以我事先不知道用户是要按天平上的 PRINT 还是输入重量。无论哪种情况,在获取数据后,我都会退出工作线程。另外,请注意我没有使用串行端口事件 DataReceived,因为我被告知它不可靠。

这是我第一次使用串口。

4

4 回答 4

11

取决于输入数据的行尾 (EOL) 字符。如果您的数据是面向行的,则 ReadLine 是一个可以使用的有效函数,但您可能需要查看 NewLine 属性并确保它已针对您的输入数据进行了适当的设置。

例如,如果您的秤为 EOL 输出换行,则设置port.NewLine = "\n";

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.newline.aspx

于 2009-03-11T23:52:21.670 回答
7

从来没有在 ReadLine 上工作过。只需在数据可用时读取本地缓冲区,然后使用单独的线程扫描数据并自己查找换行符。

于 2009-03-12T12:58:56.617 回答
1
if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
于 2015-07-17T11:58:56.060 回答
1

我正在添加一个答案来回应 Elias Santos。使用 ReadExisting 方法有一些陷阱:

https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting(v=vs.110).aspx

请注意,此方法可能会在内部缓冲区中留下尾随前导字节,这会使 BytesToRead 值大于零。

我之前遇到过 ReadExisting 的一些问题,这是因为不需要的字节。使用 Readline 解决了这些问题。

于 2016-06-28T09:00:50.290 回答