55

たとえば pySerial を使用してシリアル デバイスと通信できることはわかっていますが、現在デバイスを持っていないが、そのデバイス用のクライアントを作成する必要がある場合はどうすればよいでしょうか? Python で「仮想シリアル デバイス」を作成し、ローカル Web サーバーを実行するように pySerial と通信させるにはどうすればよいですか? よく検索していないだけかもしれませんが、このトピックに関する情報を見つけることができませんでした。

4

6 に答える 6

48

これは私がやったことであり、これまでのところうまくいきました:

import os, pty, serial

master, slave = pty.openpty()
s_name = os.ttyname(slave)

ser = serial.Serial(s_name)

# To Write to the device
ser.write('Your text')

# To read from the device
os.read(master,1000)

より多くの仮想ポートを作成しても問題はありません。同じ名前であっても、異なるマスターが異なるファイル記述子を取得するためです。

于 2013-02-26T17:29:44.457 に答える
8

./foo次のコードを使用して、任意のシリアル ポートをエミュレートできました。

SerialEmulator.py

import os, subprocess, serial, time

# this script lets you emulate a serial device
# the client program should use the serial port file specifed by client_port

# if the port is a location that the user can't access (ex: /dev/ttyUSB0 often),
# sudo is required

class SerialEmulator(object):
    def __init__(self, device_port='./ttydevice', client_port='./ttyclient'):
        self.device_port = device_port
        self.client_port = client_port
        cmd=['/usr/bin/socat','-d','-d','PTY,link=%s,raw,echo=0' %
                self.device_port, 'PTY,link=%s,raw,echo=0' % self.client_port]
        self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        time.sleep(1)
        self.serial = serial.Serial(self.device_port, 9600, rtscts=True, dsrdtr=True)
        self.err = ''
        self.out = ''

    def write(self, out):
        self.serial.write(out)

    def read(self):
        line = ''
        while self.serial.inWaiting() > 0:
            line += self.serial.read(1)
        print line

    def __del__(self):
        self.stop()

    def stop(self):
        self.proc.kill()
        self.out, self.err = self.proc.communicate()

socatインストールする必要があります ( sudo apt-get install socat)、およびpyserialpython パッケージ ( pip install pyserial)。

Python インタープリターを開き、SerialEmulator をインポートします。

>>> from SerialEmulator import SerialEmulator
>>> emulator = SerialEmulator('./ttydevice','./ttyclient') 
>>> emulator.write('foo')
>>> emulator.read()

その後、クライアント プログラム./ttyclientを pyserial でラップして、仮想シリアル ポートを作成できます。/dev/ttyUSB0クライアントコードを変更できない場合は、 client_port などを作成することもできますが、必要になる場合がありますsudo

この問題にも注意してください: Pyserial は仮想ポートでうまく再生されません

于 2016-05-26T02:03:39.480 に答える
6

com0com (Windowsを使用している場合) などを使用して仮想シリアル ポートをセットアップし、その上で開発する方が簡単な場合があります。

于 2010-02-18T20:14:42.520 に答える
5

デバイスにアクセスせずにアプリケーションをテストする必要がある場合は、おそらくループ デバイスがその役割を果たします。pySerial 2.5 https://pythonhosted.org/pyserial/url_handlers.html#loopに含まれています

于 2011-02-18T18:53:54.193 に答える
4

それはあなたが今達成しようとしていることに少し依存します...

シリアルポートへのアクセスをクラスでラップし、ソケットI/OまたはファイルI/Oを使用する実装を作成できます。次に、同じインターフェイスを使用するようにシリアルI / Oクラスを記述し、デバイスが使用可能になったときにプラグインします。(これは、実際には、外部ハードウェアを必要とせずに機能をテストするための優れた設計です。)

または、コマンドラインインターフェイスにシリアルポートを使用する場合は、stdin/stdoutを使用できます。

または、 Linux用の仮想シリアルデバイスに関するこの他の答えがあります。

于 2010-02-18T21:05:15.773 に答える