我目前正在努力解决我在使用 QSerialPort 并使用 Windows XP SP3、Python 3.3.3 和 PyQt5 5.1.1 发出信号时遇到的一个奇怪的段错误。
我真的很想知道这是否也发生在带有 C++ 的纯 Qt 中,但是我的 C++ 很糟糕,而且我没有设置正在运行的工具链。
最小的示例代码(抱歉,无法简化更多):
#!/usr/bin/python
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
from PyQt5.QtCore import QObject, pyqtSlot, QIODevice, pyqtSignal
from PyQt5.QtSerialPort import QSerialPort
PORT = 'COM59'
class DVIFlasher(QObject):
ser = None
flash_done = pyqtSignal(int, int)
def __init__(self):
super(DVIFlasher, self).__init__()
self.ser = QSerialPort(PORT)
self.ser.readyRead.connect(self.read)
def flash(self):
print(self.ser.open(QIODevice.ReadWrite))
self.ser.setBaudRate(115200)
def read(self):
print("Got data")
self.ser.close()
self.flash_done.emit(0, 0)
class Widget(QWidget):
def __init__(self):
super(Widget, self).__init__()
self.btn = QPushButton("Start", self)
self.flasher = DVIFlasher()
self.btn.clicked.connect(self.flasher.flash)
self.resize(self.btn.sizeHint())
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Widget()
win.show()
sys.exit(app.exec_())
当我运行它并通过串行端口接收一个字节时,我在 qt5serialport.dll 中得到一个“访问冲突”(又名 segfault)。有时在第一次单击“开始”时会发生这种情况,有时在第二次单击“开始”后会发生。
到目前为止我观察到的一些事情:
信号需要有一个 bool/int 作为第一个参数,以及其他一些参数——否则它似乎不会触发。
当我在端口关闭( )之前发出信号时
self.ser.close()
,它似乎没有触发。在 Linux 上(Archlinux、Python 3.3.2、PyQt 5.1.1)我无法重现这一点,但在第二次启动后,我总是得到
QSocketNotifier: Invalid socket specified
.
是什么赋予了?难道我做错了什么?或者这是某个地方的 [Py]Qt 中的错误?