用C语言编写多线程串行端口程序

Serial port programming with multi-thread in C

本文关键字:多线程 串行端口 程序 语言      更新时间:2023-10-16

我正在编写一个gtk应用程序(在c++中)通过串口与电机控制器通信。我正在使用Linux Ubuntu和termios lib。我需要关于做这件事的最佳解决方案的建议。以下是我的约束条件:当我发送请求时,控制器会给我返回一条消息2-如果发生错误,控制器可以随时向我发送错误通知请求是以[CR]结尾的ansi字符串4-控制器答案为以[CR][NL]

结尾的ansi字符串

由于(3)和(4),我认为在CANONICAL模式下配置串行端口是合适的。由于GUI +(2),我想到了多线程:一个主线程在串行端口上写用户请求,另一个无限线程读取控制器答案。你认为这是个好主意吗?

第二个问题:如果我使用多线程,我希望能够在我需要的时候写数据,所以我必须找到一种方法来停止/睡眠读线程在写期间可能使用pthread_cond_wait。我说的对吗?我见过投票和选择函数,但我不太理解它们,我不确定它们是否与规范模式兼容。

我开始使用多线程和串口。我在谷歌、论坛上读了很多东西……但是对于一个初学者来说,大量的信息是有点压倒性的。

谢谢你的帮助。

在这里,将GUI与串行端口分开要考虑的主要问题是延迟。您是否会执行任何操作,导致您需要轮询端口一段特定的时间,这将引起用户的注意?如果你只是做请求/回复,并且延迟很低,你的用户可能不会注意到这些延迟。此外,我认为接收这些异步错误消息也不会造成任何明显的延迟。除非你知道在Init消息或类似的东西被发送到控制器后可能会有很多秒的延迟,否则保持应用程序的单线程可能会让你的生活简单得多。

另一方面,如果会有那些大的延迟,或者你只是想搞乱多线程,我会开始用一个线程做所有的GUI工作,另一个线程处理所有的串行IO。在这两个线程之间使用消息传递或事件通知来协调您的活动,它应该非常直接。