data/method/mavlink/pymavlink/tools/sertotcp.py

88 lines
2.1 KiB
Python
Raw Permalink Normal View History

2024-07-24 18:30:46 +08:00
#!/usr/bin/env python3
"""
map a serial port to an outgoing TCP connection
Released under GNU GPLv3 or later
"""
from __future__ import print_function
from argparse import ArgumentParser
import errno
import serial
import socket
import time
parser = ArgumentParser(description=__doc__)
parser.add_argument("--baudrate", default=57600, type=int, help="baud rate")
parser.add_argument("serialport", type=str, help="serial port")
parser.add_argument("desthost", type=str, help="destination host")
parser.add_argument("destport", type=int, help="destination port")
args = parser.parse_args()
serport = serial.Serial(args.serialport, args.baudrate, timeout=0)
tcpsock = None
def open_socket():
global tcpsock
try:
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.connect((args.desthost, args.destport))
tcpsock.setblocking(0)
print("Connected to %s:%u" % (args.desthost, args.destport))
except Exception:
pass
open_socket()
while True:
gotdata = False
if serport is None:
try:
print("Reopening %s" % args.serialport)
serport = serial.Serial(args.serialport, args.baudrate, timeout=0)
except Exception:
time.sleep(1)
continue
print("Opened %s" % args.serialport)
if tcpsock is None:
open_socket()
time.sleep(0.1)
continue
try:
n = serport.inWaiting()
except Exception:
serport = None
time.sleep(1)
continue
if n > 0:
b = serport.read(n)
if b:
try:
tcpsock.send(b)
except socket.error:
tcpsock.close()
tcpsock = None
continue
gotdata = True
try:
b = tcpsock.recv(1000)
except socket.error as e:
if e.args[0] in [errno.EWOULDBLOCK, errno.EAGAIN]:
time.sleep(0.02)
continue
tcpsock.close()
tcpsock = None
continue
if b:
serport.write(b)
gotdata = True
if not gotdata:
time.sleep(0.02)