Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C语言中多线程串口编程_C++_Linux_Serial Port - Fatal编程技术网

C++ C语言中多线程串口编程

C++ C语言中多线程串口编程,c++,linux,serial-port,C++,Linux,Serial Port,我正在编写一个gtk应用程序(用C++编写),通过串口与电机控制器通信。我正在使用Linux Ubuntu和termios lib。 我需要关于做这件事的最佳解决方案的建议。 以下是我的限制条件: 1-当我发送请求时,控制器会向我发回一条消息 2-如果发生错误,控制器可随时向我发送错误通知 3-请求是以[CR]结尾的ANSII字符串 4-控制器答案为ANSII字符串,以[CR][NL]结尾 由于(3)和(4),我认为以规范模式配置串行端口是合适的。 由于GUI+(2),我考虑了多线程:一个在串行

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

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

第二个问题:如果我使用多线程,我希望能够在需要时写入数据,因此我必须找到一种方法在写入过程中停止/休眠读取线程,可能是使用pthread_cond_wait。我说得对吗?我见过poll和select函数,但我并不真正理解它们,也不确定它们是否与规范模式兼容

我开始学习多线程和串行端口。我在谷歌、论坛上读了很多东西……但是对于初学者来说,大量的信息有点让人不知所措


谢谢你的帮助。

这里考虑的主要问题是将GUI与串口隔离开来。您是否曾经执行过任何操作,这些操作会导致您需要在用户可以注意到的特定时间内轮询端口?如果您只是执行请求/回复,而这些延迟非常低,那么您的用户可能不会注意到任何延迟。另外,接收这些异步错误消息也不会造成我想象中的任何明显延迟。除非您知道在Init消息或类似消息被发送到控制器后可能会有几秒钟的延迟,否则保持应用程序单线程可能会使您的生活简单得多


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

最好的做法是开始尝试。你的建议听起来很合理。当您遇到具体问题或有具体问题时,请返回SO。谢谢您的回复。我用一个线程创建了一个请求/回复应用程序,该程序运行良好,但正如我在第一步所说的,马达控制器也可以随时向我发送错误消息。使用此方法,我无法捕获此错误消息。我不知道如何在不使用冻结GUI的无限循环的情况下进行轮询。在使用mul-threading之前,我一直在尝试其他解决方案……我不确定termios lib提供了什么,但您希望在UART提供数据时寻找生成事件的方法。然后您就可以侦听该事件,而不需要轮询端口。