現在、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 のバグですか?