eth_over_uart/tcp_uart.py

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)