I'm trying to create a simple program in Python that opens N serial ports (through pyserial) and forward every byte received on one of those ports to the other ports.

At startup I open the ports and create and start a thread to manage the receiving. When a byte is received, I call the .write() method for all the other ports.

It works, but sometimes it seems to block. I think I haven't used correctly the threads.

Below is my code, I hope someone can help me.

Consider that I'm a newbie in python and I never used threads before.


import serial
import threading
import sys, os
import signal
import time

class Miniterm(object):
  def __init__(self, port, baudrate):
    self.serial = serial.Serial(port, baudrate, timeout=1)

  def start(self, com_list):
    self.alive = True
    self.com_list = com_list
    self._reader_alive = True
    self.receiver_thread = threading.Thread(target=self.reader)
    self.receiver_thread.setDaemon(True)
    self.receiver_thread.start()

  def stop(self):
    self.alive = False

  def reader(self):
    try:
      while self.alive and self._reader_alive:
        data = self.serial.read(1)
          if len(data) > 0:
          for p in self.com_list:
            if p[1] != self:
              p[1].write(data)
    except serial.SerialException:
      self.alive = False
      raise

  def write(self, data):
    self.serial.write(data)
        
if __name__ == "__main__":
  ports = []
  for com in sys.argv[1:]:
    try:
      miniterm = Miniterm(com, 38400)
    except serial.SerialException:
      sys.stderr.write("could not open port " + com)
      sys.exit(1)
    ports.append((com, miniterm))
    for p in ports:
      p[1].start(ports)
      print("Port " + p[0] + " has started", flush=True)
    while True:
      time.sleep(1)

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to