我使用qt4reactor在Linux上运行Qt应用程序 应用程序在串行端口上发送和接收字节。 这在使用QtReactor
的Linux上非常有效然而,当我将应用程序移植到Windows时,我遇到了问题。 在Windows上我使用_win32SerialPort中的SerialPort类。 _win32SerialPort中的doc字符串非常清楚:
Requires PySerial and win32all, and needs to be used with win32eventreactor.
我假设需要使用win32eventreactor是因为addReader,addWriter方法是为windows编写的。
当使用QtReactor时,只要在传输上调用了loseConnection,就会调用twisted.internet.abstract中的loseConnection,最终调用qt4reactor addWriter方法(刷新输出)。
然后创建一个qt4reactor.TwistedSocketNotifier,它尝试获取select()的文件描述符号。 _win32SerialPort不会覆盖abstract.fileno方法,所以始终返回-1并且我得到了
QSocketNotifier: Invalid Socket specified
我已经看过很多关于多个反应器的帖子不允许扭曲,但我认为我在这里假设我需要Qt应用程序的QtReactor和Windows串口的win32eventreactor。
或者我可以使用其他一些解决方法吗?
注1:在Windows上使用QtReactor时,串口工作正常,即可以发送和接收数据。只有当我关闭应用程序时才会收到“指定无效套接字”
注2:现在我找到了一个解决方法。我使用QtReactor,但在关闭我的应用程序时我做了
serial.connectionLost(failure.Failure(Exception))
其中serial是_win32serialport.SerialPort
的实例这样就不会调用abstract.loseConnection,这意味着永远不会调用QtReactor addWriter来刷新输出。我怀疑最好的解决方案是调用lostConnection并正确刷新输出。
答案 0 :(得分:2)
我最近添加了selectreactor, iocpreactor, and gtkreactor on Windows支持的串口。我希望这种方法可以扩展到在Qt反应器中支持它们。
答案 1 :(得分:0)
在Win32反应器的空闲事件中调用Qt消息检查/处理函数。