使用 Qt 的 C++ 中的线程串行端口通信

Posted

技术标签:

【中文标题】使用 Qt 的 C++ 中的线程串行端口通信【英文标题】:threaded serial port communication in C++ with Qt 【发布时间】:2017-01-16 06:08:15 【问题描述】:

我正在编写一个 QT 桌面应用程序,它将显示从串行端口接收到的信息。因此,使用标准 Windows API 功能创建了一个类并将其打包到一个 DLL 中,以与连接的设备(CreateFile、ReadFile、WriteFile...)进行通信。

此时计时器以预定义的速率 [

最好使用线程来解决这个问题,还是我应该重写类来做基于工作事件的工作?目标是,gui 不会冻结。

编辑: 我使用 QThread 派生的带有 run() 函数的工作类解决了这个问题,它在后台处理串行端口通信并在新信息可用时更新 gui。

【问题讨论】:

有什么理由不用QSerialPort QSerialPort 已经完成了与串行端口异步通信的工作。如果您的目标只是不冻结 GUI,那么使用线程来完成这样的任务是可行的,但这是一种矫枉过正的做法。异步方法更适用于 Qt,而且更易于维护。 项目刚开始的时候,我们是不会用qt的。所以我们开始只使用 windows api 不管是什么原因。由于您现在已切换到使用 Qt,我强烈建议您改用 QSerialPort`。 【参考方案1】:

在许多用例中,在单独的线程上执行所有阻塞(同步)I/O 是一种很好的做法,尤其是在涉及图形用户界面时。 Here's a page I've referenced 关于同步 I/O 的挑战(与异步相反,您的代码不会阻塞但仍然是单线程的,或者您正在讨论的并行)。除了您提出的问题之外,还有更多问题,例如:

如果没有可用数据怎​​么办? GUI 是否会阻塞直到有数据?例如,如果发送方关闭,则将没有数据 如果 I/O 设备不再可用,程序会做什么?例如,如果是 USB 转串口适配器,拔掉适配器会怎样?

【讨论】:

感谢您的文章。这很有帮助。我会尝试 std::thread 来解决这个问题。如果数据不可用,则 dll 返回错误并记录在 gui 中。如果拔下电源,也会显示错误消息。在此之前我已经处理了这些可能性;-) 正如其他评论者所建议的:在 QT 中有标准的方法可以做到这一点,您应该考虑他们的方法。该链接仅讨论范例。除非你只是为了好玩而学习线程。

以上是关于使用 Qt 的 C++ 中的线程串行端口通信的主要内容,如果未能解决你的问题,请参考以下文章

串行通信 C++ ReadFile()

在 Qt Blocking Master 示例中使用 Mutex

使用 VSPE 的 WPF 中的串行端口通信问题

使用 pyside 进行异步串行通信

在串行端口(QtSerialPort)读取传入字节的连续流

使用 Qt GUI 从所有可用的串行端口中进行选择