【问题标题】:C# Windows Form - Serial Port problem / BackgroundWorkerC# Windows 窗体 - 串口问题/BackgroundWorker
【发布时间】:2018-12-30 03:23:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# multithreading winforms serial-port backgroundworker


    【解决方案1】:

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

    更多信息请查看:

    【讨论】:

    • 感谢您的回答,从 ReadLine() 更改为 ReadExisting() 解决了问题。但是现在我遇到了另一个问题,即如何拆分字符串以绘制图表,因为现在我没有一个字符串,而是将多个字符串存储在一个字符串中。该字符串具有以下格式:“value time \n”,其中 value 从 0 到 1024,时间以秒为单位,有 4 个小数位。在我每次只有一个字符串之前,我使用了 .Split(' ') 但现在考虑到字符串已更改,我无法使其工作,我已经尝试循环执行但没有成功。有什么建议吗?
    • 字符串解析问题似乎与最初的问题无关。如果答案解决了您最初的问题,请考虑接受它并提出一个新问题,以便将不相关问题的讨论分开。
    猜你喜欢
    • 2017-10-23
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多