1

我目前正在努力解决我在使用 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 中的错误?

4

1 回答 1

1

你正面临这个错误。这是一个相对古老的问题并且众所周知。如果幸运的话,它可以在 5.2.1 中修复。您关于不调用信号处理程序的解决方法ser.close()看起来readyRead很合理。

希望这可以帮助。

于 2013-12-18T09:51:39.990 回答