私は pyserial を使用して 2 つのポートを開き、もう一方から読み取ったものをそれぞれに書き込みます。次に、これらのポートの 1 つに物理 COM ポートを接続し、もう一方のポートに仮想 COM ポートを接続します。仮想 com ポートは、シミュレーターが接続する 2 番目の仮想 com ポートに接続されます。
Hardware device <> COM1 <> Python Script <> VCOM2 <> VCOM3 <> Simulator
スクリプトで通信が正しく COM ポートに出入りしていることがわかりますが、ハードウェアがシミュレータと正しく通信できていないため、何かが正しくありません。
Python スクリプトの代わりに実行できる古い C アプリがありますが、これは正しく機能します。しかし、それは非常によく書かれておらず、すべてのバグを修正することにあまり関心がありません。なので、このアプリを Python スクリプトに置き換えたいと思っています。最終的には、ポートを通過するデータをタイムスタンプ付きでログに記録したいと考えています。
どちらの場合も正しいボーレートを使用していますが、何かが足りないようです。DTR など、各ポート間で信号を転送する必要がありますか? pyserial には次の機能があります。
sendBreak(duration=0.25)
setBreak(level=True)
setRTS(level=True)
setDTR(level=True)
getCTS()
getDSR()
getRI()
getCD()
どのシグナルに興味がありますか?
編集:
ポートごとにこれらの値をポーリングすると、次のようになります。
getCTS()、getDSR()、getRI()、getCD()
取得: True、False、False、True COM1 False、False、False、False VCOM2
ただし、CD が false になることがあります。これを VCOM2 経由で転送するにはどうすればよいですか、またはこれを行う必要がありますか?
編集:
これが私のコードです。通信が開始されると、スクリプトがロックされ、コンピューターを再起動してポートを解放する必要があります。関連する python プロセスを Windows 7 で強制終了できません...
import serial
class NewMonitor():
def __init__(self, com_port_1, com_port_2):
self.read_time_in_seconds = 0.1
self.serialPort1 = serial.Serial(com_port_1, 9600, timeout=self.read_time_in_seconds, rtscts=True, dsrdtr=True)
self.serialPort2 = serial.Serial(com_port_2, 9600, timeout=self.read_time_in_seconds, rtscts=True, dsrdtr=True)
try:
while True:
item = self.serialPort1.read()
self.serialPort2.write(item)
self.serialPort2.setRTS(self.serialPort1.getCTS())
self.serialPort2.setDTR(self.serialPort1.getDSR())
item = self.serialPort2.read()
self.serialPort1.write(item)
self.serialPort1.setRTS(self.serialPort2.getCTS())
self.serialPort1.setDTR(self.serialPort2.getDSR())
finally:
self.serialPort1.close()
self.serialPort2.close()