我有一个PC软件(操作系统:Win64位),它通过物理串行端口RS232与机器通信,我想使用python为该端口做一个嗅探器。请注意,我是串行端口的初学者。
我已经阅读了许多在线发布的文档和问题,但大多数都要求只使用第三方软件,但我不能这样做,因为原始字节必须解码为字符串消息(我有自己的decode/encode方法)。
目前我有这样的设置:
/////////////////// Physical COM1 /////////////
// (PC) Software // <------------------------> // Machine //
/////////////////// /////////////我想让python输出任何通过COM1传递的字节。
所需的行为图(虚拟串行端口有一个问号,因为我不确定这是否是正确的方法):
/////////////////// Physical COM1 /////////////
// (PC) Software // <------------------------> // Machine //
/////////////////// | Virtual /////////////
| serial port?
v
//////////////////
// (PC) Sniffer // (Python)
//////////////////
|
v
(output bytes)那些知道高级串行端口监视器的人,它的"spymode“功能正是我试图使用python实现的。
我尝试过使用com0com和PortMon,但我找不到一种方法来配置com0com来监听物理端口(据我观察,com0com只做虚拟端口),而且PortMon不支持Windows64位。
我被困在这里好几天了.任何评论/链接/答案都将不胜感激。谢谢,
发布于 2013-10-08 02:58:40
你应该通过pySerial
一次只能有一个函数获取串口。
对于单向通信(从机器到PC软件),我能想到的从串口嗅探的唯一方法是从port1读取并写入port2,其中您的机器正在写入port1,而PC软件已修改为从port2读取。
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)要实现全双工(异步双向通信),你需要有两个进程,每个方向一个。你需要以某种方式同步这些进程。一种方法是,一个进程从port1读取数据,另一个进程向port2写入数据,反之亦然。阅读此question
发布于 2013-10-08 02:15:42
为什么不像这样回显一下:
PC软件<--> COMn(COM0COM)COMm <--> python监控与转发<--> COM1 <-->机器
在软件方面,您需要两个串行任务,一个打开COMm,一个打开COM1,还有一个中央记录器,COMm上的任何内容都会被记录下来,然后转发到COM1,反之亦然。
发布于 2019-01-26 15:18:38
我们可以使用上面的代码,而不需要通过线程来实现半双工通信。我们将使用一个无限循环和一个变量来指定我们正在读取的端口。
import serial
import time
baud_rate = 9600 # whatever baudrate you are listening to
com_port1 = '/dev/ttyUSB0' # replace with your first com port path
com_port2 = '/dev/ttyUSB1' # replace with your second com port path
ComRead_timeout = 0.1 # Read timeout to avoid waiting while there is no data on the buffer
ComWr_timeout = 0.1 # Write timeout to avoid waiting in case of write error on the serial port
log = open('log.txt', 'a+') # Open our log file, to put read data
From_PC_To_Device = True # this variable is used to specify which port we're gonna read from
listener = serial.Serial(port=com_port1, baudrate=baud_rate, timeout=ComRead_timeout,
write_timeout=ComWr_timeout)
forwarder = serial.Serial(port=com_port2, baudrate=baud_rate, timeout=ComRead_timeout,
write_timeout=ComWr_timeout)
while 1:
while (listener.inWaiting()) and From_PC_To_Device:
serial_out = listener.readline()
localtime = time.asctime(time.localtime(time.time()))
Msg = "PC " + localtime + " " + serial_out
Msg += "\n"
log.write(Msg)
print(serial_out) # or write it to a file
forwarder.write(serial_out)
else:
From_PC_To_Device = False
while (forwarder.inWaiting()) and not From_PC_To_Device:
serial_out = forwarder.readline()
localtime = time.asctime(time.localtime(time.time()))
Msg = "DEVICE " + localtime + " " + serial_out + "\n"
log.write(Msg)
print(serial_out) # or write it to a file
listener.write(serial_out)
else:
From_PC_To_Device = Truehttps://stackoverflow.com/questions/19231465
复制相似问题