たとえば pySerial を使用してシリアル デバイスと通信できることはわかっていますが、現在デバイスを持っていないが、そのデバイス用のクライアントを作成する必要がある場合はどうすればよいでしょうか? Python で「仮想シリアル デバイス」を作成し、ローカル Web サーバーを実行するように pySerial と通信させるにはどうすればよいですか? よく検索していないだけかもしれませんが、このトピックに関する情報を見つけることができませんでした。
6 に答える
これは私がやったことであり、これまでのところうまくいきました:
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)
より多くの仮想ポートを作成しても問題はありません。同じ名前であっても、異なるマスターが異なるファイル記述子を取得するためです。
./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
)、およびpyserial
python パッケージ ( 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 は仮想ポートでうまく再生されません
com0com (Windowsを使用している場合) などを使用して仮想シリアル ポートをセットアップし、その上で開発する方が簡単な場合があります。
デバイスにアクセスせずにアプリケーションをテストする必要がある場合は、おそらくループ デバイスがその役割を果たします。pySerial 2.5 https://pythonhosted.org/pyserial/url_handlers.html#loopに含まれています
それはあなたが今達成しようとしていることに少し依存します...
シリアルポートへのアクセスをクラスでラップし、ソケットI/OまたはファイルI/Oを使用する実装を作成できます。次に、同じインターフェイスを使用するようにシリアルI / Oクラスを記述し、デバイスが使用可能になったときにプラグインします。(これは、実際には、外部ハードウェアを必要とせずに機能をテストするための優れた設計です。)
または、コマンドラインインターフェイスにシリアルポートを使用する場合は、stdin/stdoutを使用できます。
または、 Linux用の仮想シリアルデバイスに関するこの他の答えがあります。