92 lines
2.0 KiB
Python
Executable File
92 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import socket
|
|
import serial
|
|
import threading
|
|
import sys
|
|
import time
|
|
|
|
class IpDevReceiver(threading.Thread):
|
|
def __init__(self, serdev, ipdev):
|
|
self.serdev = serdev
|
|
self.ipdev = ipdev
|
|
threading.Thread.__init__(self)
|
|
|
|
def run(self):
|
|
while True:
|
|
r = self.ipdev.recv(10000)
|
|
|
|
class IpDevReceiver(threading.Thread):
|
|
def __init__(self, ipdev, serdev):
|
|
self.serdev = serdev
|
|
self.ipdev = ipdev
|
|
threading.Thread.__init__(self)
|
|
|
|
def run(self):
|
|
while True:
|
|
r = self.ipdev.recv(10000)
|
|
l = len(r)
|
|
print("[TCP ] RX Frame")
|
|
ser.write(l.to_bytes(2, byteorder='little'))
|
|
ser.write(r)
|
|
|
|
class SerDevReceiver(threading.Thread):
|
|
def __init__(self, ipdev, serdev):
|
|
self.serdev = serdev
|
|
self.ipdev = ipdev
|
|
self.buf = []
|
|
self.exp = 0
|
|
threading.Thread.__init__(self)
|
|
|
|
def run(self):
|
|
while True:
|
|
r = self.serdev.read(1)
|
|
if (len(r) <= 0):
|
|
print(".")
|
|
continue
|
|
self.buf += r
|
|
#print("RX {} bytes. Buffer at {}.".format(len(r), len(self.buf)))
|
|
while True:
|
|
if (self.exp > 0):
|
|
if (len(self.buf) >= self.exp):
|
|
print("[UART] Frame RX complete ({} bytes)".format(self.exp))
|
|
self.ipdev.sendall(bytes(self.buf[:self.exp]))
|
|
self.buf = self.buf[self.exp:]
|
|
self.exp = 0
|
|
else:
|
|
#print("Data frame incomplete")
|
|
break
|
|
elif len(self.buf) >= 2:
|
|
self.exp = self.buf[0] + (self.buf[1] << 8)
|
|
self.buf = self.buf[2:]
|
|
print("[UART] Frame start. Expecting {} bytes".format(self.exp))
|
|
else:
|
|
#print("Header still incomplete")
|
|
break
|
|
|
|
|
|
mode = sys.argv[1]
|
|
dev = sys.argv[2]
|
|
port = int(sys.argv[3])
|
|
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
if (mode == "s"):
|
|
s.bind(('localhost', port))
|
|
s.listen(1)
|
|
print("Waiting for TCP connection on port {}...".format(port))
|
|
conn, addr = s.accept()
|
|
else:
|
|
s.connect(("localhost", port))
|
|
conn = s
|
|
|
|
print("Forwarding data...")
|
|
|
|
ser = serial.Serial(dev, 1000000, timeout=1)
|
|
|
|
serdev_r = SerDevReceiver(conn, ser)
|
|
serdev_r.start()
|
|
serdev_s = IpDevReceiver(conn, ser)
|
|
serdev_s.start()
|
|
|
|
while True:
|
|
time.sleep(1)
|