被动串口监视器
我正在使用pyserial来打开两个端口,然后把从一个端口读取到的数据写入另一个端口。我有一个物理的串口连接到其中一个端口,还有一个虚拟串口连接到另一个。这个虚拟串口又连接到第二个虚拟串口,而我的模拟器就是连接到这个第二个虚拟串口上:
Hardware device <> COM1 <> Python Script <> VCOM2 <> VCOM3 <> Simulator
我可以看到在我的脚本中,数据在串口之间的进出是正常的,但似乎有什么地方不对,因为硬件和模拟器之间的通信不太正常。
我有一个旧的C语言应用程序,可以代替这个Python脚本运行,而且运行得很好。不过,这个程序写得很糟糕,我也不想去修复它的所有bug。所以我希望能用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传输这个信号,或者我需要这样做吗?
编辑:
这是我的代码。一旦通信开始,脚本就会卡住,我需要重启电脑才能释放端口。在Windows 7上,我无法结束相关的Python进程...
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()
1 个回答
你不能忽视信号,特别是当你使用硬件基础的流控制时。我假设除了接收信号(RX)和发送信号(TX),你至少还需要在两个端口之间连接以下信号。
CTS -> RTS
DSR -> DTR
关于你代码的几点建议:
你定义了一个超时时间,这意味着输入输出功能会被阻塞(即使只是短暂的时间)。可以考虑把它设置为0。
你调用了没有参数的读取函数。这只会读取一个字节。你有没有什么特别的原因不想一次读取更多的数据?这样可以减少开销。
考虑在while循环中添加一个退出条件。目前代码会一直运行,直到pyserial抛出异常。