使用 pyside 进行异步串行通信

Posted

技术标签:

【中文标题】使用 pyside 进行异步串行通信【英文标题】:asynchronous serial communication using pyside 【发布时间】:2017-03-17 21:16:45 【问题描述】:

我正在使用 pyside 并尝试与之进行异步串行通信,但 QtSerialPort 尚不可用, 我使用了 pyserial 并将串行通信移动到另一个线程 moveToThread() 但我必须定期检查是否有消息,所以我使用QTimer 每 200 毫秒处理一次,但如果我可以让 Qt 每次都发送 readyRead 信号,这个解决方案就过分了有可用的数据,问题恰恰是:

是否有一个现成的模块可以在不破坏我对 pyside 的整个代码依赖的情况下提供帮助? 如果没有,您有什么快速实施的技巧? 提前致谢。

【问题讨论】:

【参考方案1】:

只要避免使用 qtserialport,你就可以使用 pyserial。一个好的方法是使用pyserial,就像你自己认为的那样,但将它作为另一个进程运行(使用multiprocessing 模块),并使用Queues 传递来自串行端口的输入/输出。

在pyside代码中,你可以注册一个类似无限循环的函数,检查队列中的数据输入,并在数据进入时做一些事情(基本上,触发串行传入事件)。你甚至可以使用@ 987654323@! ?

这样,您可以在单个代码库中保持代码紧凑,但在功能方面松散耦合,而不需要像 IPC 这样的简单队列而产生额外的膨胀。

因为global interpreter lock 的存在,python 中的线程可能会很棘手,而且当您将 Qt 线程模型(和 eventloop)与 python 一起工作时更是如此。 根据经验:不要将香蕉和西红柿混在一起。

【讨论】:

你能详细说明为什么不使用QtSerialPort,是的,我使用了带有pyserial的Qt线程,但是当有可用数据时我只是发出一个信号 嗯,长话短说,这是一个有很多技术债务的框架,过度设计,开发人员很难沟通,并且有太多错误。再加上 python 抽象的开销,there are dragons. 我查看了用 cpp 编写的 qserialport 源代码,它在 qt 库中的编写、组织和批准似乎非常好,我可能会考虑使用 cpp 开发这个模块 好吧,相信一个来自互联网的随机家伙的经历,他对此有过痛苦的经历,试图提交几个补丁,结果以无休止的设计辩论告终。最终,我不得不将中间项目切换到 asio,它提供了一个可移植且正确工作解决方案来处理串行端口。我唯一仍在使用QtSerialPort 的是QtSerialPortInfo 类,它可以提供有关跨平台可用端口的信息。 :),好吧,我会认真对待您的建议,我真的对它处理异步接收数据的方式很感兴趣,而您建议的解决方案没有提供另一种方法来实现这一点,我想每 200 毫秒左右的可用数据不是一个好主意,如果您能建议如何使用 qiodevice 实现类似的事情,将不胜感激,谢谢【参考方案2】:

我找到了一种解决方法,它使用 PyQt5 串行端口模块并构建一个独立模块来处理串行通信并使用进程间通信 (IPC) 或本地网络套接字与我的主应用程序进行通信,现在就可以了,并且我把这个串口通信模块开源没有问题,我的主应用程序是完整的。

【讨论】:

以上是关于使用 pyside 进行异步串行通信的主要内容,如果未能解决你的问题,请参考以下文章

MODBUS-RTU串行链路通信协议及测试方法

C51编写串行通信,在proteus中仿真调试————终极保姆级教学

C51编写串行通信,在proteus中仿真调试————终极保姆级教学

C51编写串行通信,在proteus中仿真调试————终极保姆级教学

C51编写串行通信,在proteus中仿真调试————终极保姆级教学

Promise 实现方法(请求)的异步(串行)执行