2

PyQT 4.7には、シリアルポートと直接通信できるQIODeviceから継承されたクラスがありません(QSerialDeviceなど)。そのため、QProcessクラスを使用して、QProcessインターフェイスを使用してメインのQTアプリケーションとインターフェイスする別のプロセスからシリアルポートへの実際の読み取り/書き込みを実装する方が簡単だと思いました。

ここで問題となるのは、以下のコードを使用している場合、送受信されるバイト数が同じではないということです。だから私の質問は、シリアルポートからバイナリデータを正しく読み取り、すべてをstdoutに転送する方法ですか?

これは、QProcessを作成する私のメインのQTプログラムからの抜粋です。

        self.micromouse_socket = QProcess()
        self.micromouse_socket.start("/home/ansis/Source/Perforce-pele/Pele/tools/console/comtalker.py", "")
        self.micromouse_socket.started.connect(self.on_micromouse_socket_started)
        self.label_8.setText("Starting COM...")

そして、これはシリアルポートと通信するプロセスです(comtalker.py;非ブロッキング部分はまだ終了していません):

#!/usr/bin/python
import serial
import sys

if __name__ == "__main__":

    ser = serial.Serial(0)

    while 1 :
        x = ser.read(1)
        sys.stdout.write(x)
        sys.stdout.flush()

PS問題はPySerialではなく別の場所にある可能性があります。もう一方のコンピューターでは、このコマンド「./binary_data_generator> / dev/ttyS0」を使用してttyS0に書き込んでいます。ASCII文字(テキスト+数字)のみを送信した場合、同じコードが正常に機能しているように見えました

4

2 に答える 2

2

PySerial(またはPyserialが依存するライブラリ)は、単一の「0x0a」(\ n)文字を2つの文字「0x0d0x0a」(\ r \ n)に変換しているようです。両方の通信エンドポイントがLinuxで実行されているので、なぜ誰かがそれらの行末を翻訳したいのかわかりません...

ここでstraceは、送信者がttyS0に\nのみを送信することを示します。

write(1, "M\n", 2)                      = 2
write(1, "\n", 1)                       = 1
write(1, "M\n", 2)                      = 2
write(1, "\n", 1)                       = 1

PySerial出力のデバッグ中に、各\nの前に\rが付いていることがわかりました。

これをバグとして主張する前に、誰が、なぜこのキャリッジリターンを追加するのかを調べるためにさらに調査を行います...

于 2011-04-13T18:39:56.757 に答える
1

stdoutはデフォルトではバイナリモードではないと思います。これが、ASCII以外のバイトが失われたように見える理由です。この質問を参照してください、それは役立つかもしれません。

私が正しく理解している場合は、2つのプロセス間の通信パイプとしてstd i/oを使用する必要があります。そのためにマルチプロセスモジュールの1つを使用することをお勧めします

お役に立てば幸いです

于 2011-04-13T06:15:31.180 に答える