Skip to content

Instantly share code, notes, and snippets.

@mo-han
Last active November 20, 2018 05:47
Show Gist options
  • Save mo-han/b69cdb65804ddb09cb1142cd3a06be9c to your computer and use it in GitHub Desktop.
Save mo-han/b69cdb65804ddb09cb1142cd3a06be9c to your computer and use it in GitHub Desktop.
A serial port bridge monitor written by python3
#!/usr/bin/env python3
import queue
import signal
import sys
import threading
from datetime import datetime
from time import time
from serial import Serial
def serial_port_relay(q, port_from, port_to):
pfn = port_from.name
while True:
byte = port_from.read(size=1)
port_to.write(byte)
q.put((pfn, time(), byte))
def logger(q):
c = 0
p_old = None
while True:
p, t, b = q.get()
if p == p_old:
print('%02X ' % b[0], end='', flush=True) # flush=True
else:
c += 1
p_old = p
print('\n\n[{count}] {port}: {ts}'.format(
count=c, ts=datetime.fromtimestamp(t), port=p))
print('%02X ' % b[0], end='', flush=True)
def win32_ctrl_c():
if sys.platform == 'win32':
# %ERRORLEVEL% = '-1073741510'
signal.signal(signal.SIGINT, signal.SIG_DFL)
if __name__ == '__main__':
win32_ctrl_c()
try:
p1 = Serial(sys.argv[1])
p2 = Serial(sys.argv[2])
if len(sys.argv) > 3:
p1.baudrate = p2.baudrate = sys.argv[3]
q = queue.Queue()
tp = threading.Thread(target=logger, args=(q, ))
t1 = threading.Thread(target=serial_port_relay, args=(q, p1, p2))
t2 = threading.Thread(target=serial_port_relay, args=(q, p2, p1))
tp.start()
t1.start()
t2.start()
except IndexError:
print('Usage: {} portA portB [baudrate]'.format(sys.argv[0]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment