2009-04-21 10 views
4

シリアルポートを常に見て、ポートから受信した入力に応じてユーザーインターフェイスを変更するアプリケーションを実行したいと考えています。私はLinux上でpyserialでポートから行を読み取ることに成功しましたが、私は定期的にこれを行う方法がわかりません:別のスレッドを作成し、タイマーイベントの入力をチェックしますか?私は何も見逃していないことを確認するにはどうすればいいですか? (何らかのハンドシェイク/プロトコルを実装することは、このような過剰なもののように思えます...)そして最も重要なのは、qt4の機能でどうすればいいのですか?pyqt4とpyserial

編集:これは私が今やっているものです(私はアプリの実行の残りの部分ではなく待っていると、定期的にこれをしたい)

class MessageBox(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

     ser = serial.Serial('/dev/ttyS0', 9600, bytesize=serial.EIGHTBITS, 
     parity=serial.PARITY_NONE,  
     stopbits=serial.STOPBITS_ONE, 
     timeout=None,   
     xonxoff=0,    
     rtscts=0, 
     interCharTimeout=None) 

     self.label = QtGui.QLabel(ser.readline(), self) 
     self.label.move(15, 10) 
     ser.close() 
     self.setGeometry(300, 300, 250, 150) 
     self.setWindowTitle('Authentication') 

     self.color = QtGui.QColor(0, 0, 0) 

     self.square = QtGui.QWidget(self) 
     self.square.setGeometry(120, 20, 100, 100) 
     self.square.setStyleSheet("QWidget { background-color: %s }" % self.color.name()) 

答えて

4

あなたはどんな、どんなバイトを見逃すことはありません保留中の入力はバッファされます。

あなたは、いくつかのオプションがあります。

  1. はPySerialとポーリングのシリアルポートをポーリングPySerial/inWaiting(シリアルポート)

  2. は/メインスレッドでタイマーを使用することをスレッドを使用待っています。

  3. ポートのハンドルを見つけてQSocketNotifierに渡します。これはLinux上でのみ動作しますが、その場合、QSocketNotifierはシリアルポートに関連付けられたファイルを監視し、利用可能なものがあるときに信号を送信します。

スレッドが不要なため、方法2と3が優れています。