C# Windows Form - 串口问题/BackgroundWorker

C# Windows Form - Serial Port problem / BackgroundWorker

我使用 C# 开发了一个 Windows 表单应用程序,它通过微控制器发送的串口接收数据。我正在使用 serialPort_DataReceived 事件接收数据,在该事件中我使用 ReadLine() 读取串口。然后我使用 Invoke 方法调用一个函数,该函数将接收到的字符串打印到文本框中。问题是应用程序无法跟上它接收字符串的速度,例如,我从微控制器发送的字符串具有发送时间,即使它已经超过 2 或 3 seconds 应用程序仍在打印在 0.2 秒发送的字符串。当我向微控制器发送一个字符串以停止发送数据时,应用程序只会在一段时间后停止打印数据,也就是说,它会不断打印存储在接收缓冲区中的值。

我相信,鉴于应用程序接收的大量数据和速率(我使用的波特率为 115200),每毫秒一个字符串,就会发生这种情况。这是,我认为应用程序总是被 DataReceived 事件中断,它没有时间打印数据并开始落后。

我克服这个问题的一种方法是使用多线程,但我不知道如何解决。我已经使用 BackgroundWorker 尝试了几个示例,但我根本没能让它工作。在编程 Windows 表单应用程序甚至 C# 方面,我仍然是菜鸟。

谁能确认问题的原因?以及如何创建一个线程来打印接收到的数据?

您可以利用 SerialPort.ReceivedBytesThreshold property and SerialPort.ReadExisting() 方法(或 StringBuilder 实例)一次性更新 UI 一批字符串,而不是单个字符串。

更多信息请查看:

  • Serial port DataReceived firing too much 关于 Whosebug 的讨论
  • Top 5 SerialPort Tips 金汉密尔顿的文章
  • Serial Port ReadLine vs ReadExisting or how to read the data from serial port properly 关于 Whosebug 的讨论
  • Quickest way to Update Multiline Textbox with Large Amount of Text 关于 Whosebug 的讨论