10

物理シリアル ポート RS232 経由でマシンと通信する PC ソフトウェア (OS: Win 64 ビット) があり、Python を使用してそのポートのスニファーを作成したいと考えています。私はシリアルポートの初心者です。

オンラインで投稿された複数のドキュメントと質問を読みましたが、それらのほとんどはサードパーティのソフトウェアを使用するように求めていますが、生のバイトを文字列メッセージにデコードする必要があるため、この方法は実行できません (私は独自のデコード/エンコード方法を持っています) )。

現在、私は次のようにセットアップしています:

///////////////////       Physical COM1        /////////////
// (PC) Software // <------------------------> // Machine //
///////////////////                            /////////////

そして、PythonがCOM1を通過したバイトを出力するようにします。

望ましい動作図 (仮想シリアル ポートには、それが正しいアプローチかどうかわからないため、疑問符が付いています):

///////////////////       Physical COM1        /////////////
// (PC) Software // <------------------------> // Machine //
///////////////////            | Virtual       /////////////
                               | serial port?
                               v
                        //////////////////
                        // (PC) Sniffer // (Python)
                        //////////////////
                               | 
                               v
                         (output bytes)

Advanced Serial Port Monitor を知っている人にとって、その「スパイモード」機能は、まさに私が python を使用して達成しようとしているものです。

com0com と PortMon を使用しようとしましたが、物理ポートをスニッフィングするように com0com を構成する方法が見つかりません (私の観察によると、com0com は仮想ポートのみを作成します)。PortMon は Windows 64 ビットをサポートしていません。

私はこれで何日も立ち往生しています...コメント/リンク/回答は大歓迎です。ありがとうございました、

4

3 に答える 3

6

pySerialを経由する必要があります

一度に 1 つの関数だけがシリアル ポートを取得できます。

一方向通信 (マシンから PC ソフトウェアへ) の場合、シリアル ポートからスニッフィングする唯一の方法は、ポート 1 から読み取り、ポート 2 に書き込むことです。ここで、マシンはポート 1 に書き込み、PC ソフトウェアは変更されています。ポート 2 から読み取ります。

import serial

baud_rate = 4800 #whatever baudrate you are listening to
com_port1 = '/dev/tty1' #replace with your first com port path
com_port2 = '/dev/tty2' #replace with your second com port path

listener = serial.Serial(com_port1, baudrate)
forwarder = serial.Serial(com_port2, baudrate)

while 1:
    serial_out = listener.read(size=1)
    print serial_out #or write it to a file 
    forwarder.write(serial_out)

全二重 (非同期双方向通信) を実現するには、各方向に 1 つずつ、2 つのプロセスが必要です。これらのプロセスを何らかの方法で同期する必要があります。これを行う 1 つの方法として、一方のプロセスがポート 1 から読み取り、もう一方のプロセスがポート 2 に書き込み、その逆も可能です。この質問を読む

于 2013-10-07T18:58:40.177 に答える