#!/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)