1

現在、Windows XP SP3、Python 3.3.3、および PyQt5 5.1.1 で、QSerialPort を使用して信号を発信するときに発生する奇妙なセグメンテーション違反に苦しんでいます。

これが純粋な Qt と C++ で同様に発生するかどうかは本当に疑問ですが、私の 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) が発生します。最初に「開始」をクリックしたときに発生することもあれば、2回目以降に発生することもあります。

これまでに観察したいくつかのこと:

  • 信号には、最初のパラメーターとして bool/int が必要であり、その他のパラメーターが必要です。そうしないと、トリガーされないようです。

  • ポートが閉じられるに信号を送信すると ( self.ser.close())、トリガーされないようです。

  • Linux (Archlinux、Python 3.3.2、PyQt 5.1.1) ではこれを再現できませんが、2 回目の起動後は常にQSocketNotifier: Invalid socket specified.

何を与える?私は何か間違ったことをしていますか?それとも [Py]Qt のバグですか?

4

1 に答える 1