我正在用PyQt5编写一个应用程序,该应用程序将用于产品的校准和测试。重要细节:
\r\n
终止。在测试/校准周期中,GUI需要与设备通信,获取读数并将这些读数记录到屏幕上的各个框中。问题在于,UART通信速度慢(如果出现通信中断,超时时间长),如何保持GUI的响应速度?
最低可接受解决方案(已在工作)是创建一个可通过串行端口进行通信的GUI,但是当该GUI等待调用{ {1}}完成或超时。
所需解决方案是一个GUI,即使在发送和接收串行数据时,它也具有良好的平滑响应感。
Stretch Goal (扩展目标)解决方案是一个GUI,它将串行通信的每个单个字符记录到用于调试的文本显示中,同时仍为实际逻辑提供了一些不错的“消息级”抽象的应用程序。
我目前的“最低可接受”实现使用状态机,在该状态机上运行一系列短函数,通常包括serial.read()
和serial.write()
命令,并带有暂停以允许GUI更新。但是状态机使GUI逻辑难以遵循。如果以简单的线性方式编写用于与设备通信的程序流,则代码将更容易理解。
我真的很犹豫在整个代码中散布一堆serial.read()
调用。甚至那些在等待processEvents()
时也无济于事。因此正确的解决方案可能涉及线程,信号和插槽,但是我猜想“线程”与“优化”具有两个相同的黄金法则:规则1:不要这样做。规则2(仅限专家):暂时不要做。
是否有任何现有的体系结构或设计模式可以用作此类应用程序的起点?
答案 0 :(得分:1)
Qt不仅是制作GUI的库,而且是具有其他模块(例如Qt Networt,Qt WebEngine,Qt Mqtt等)的库,这些模块可以在不阻塞Qt事件循环的情况下工作,在这种情况下,最好使用Qt SerialPort
避免了总是带来线程的问题。例如,在this answer中,我展示了使用Qt SerialPort和线程+ pyserial实现相同解决方案的方法。
答案 1 :(得分:0)
好吧,在过去的几天里,我一直在挖掘,并弄清楚如何做到这一点。既然没有任何回应,而且我确实认为此问题可能适用于其他人,所以我将继续发布解决方案。简要地:
总而言之,它最终只是对现有原理的非常简单的应用,但是我正在写下来,因此希望下一个家伙不必像我一路走下去那样走那么多盲巷。