Как читать с нескольких последовательных входов в Python? - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь прочитать два последовательных порта для скрипта контроля доступа в Python.Один последовательный порт имеет считыватель RFID, другой имеет считыватель штрих-кода.Я хочу, чтобы пользователь представил свою карту, будь то штрих-код или RFID, и скрипт для проверки прав доступа.

serRFID = serial.Serial(
  port = '/dev/ttyUSB0',
  baudrate = 9600,
  parity = serial.PARITY_NONE,
  stopbits = serial.STOPBITS_ONE,
  bytesize = serial.EIGHTBITS,
  timeout = 10)

serBARC = serial.Serial(
  port = '/dev/ttyACM0',
  baudrate = 38400,
  parity = serial.PARITY_NONE,
  stopbits = serial.STOPBITS_ONE,
  bytesize = serial.EIGHTBITS,
  timeout = None)

def readtag():
  global tag_inp
  serBARC.reset_input_buffer()
  tag_inp = ""
  while tag_inp == "":
    read_byte1 = serBARC.read(11)
    if len(read_byte1) == 11:
      tag_inp = read_byte1

Выше работает, но, очевидно, только с читателем штрих-кода.Если я изменяю на serRFID вместо serBARC в определении «readtag», это также работает, но я хочу, чтобы оба считывались, и только тот, который возвращает данные (RFID или штрих-код), был сохранен как «tag_inp»

1 Ответ

0 голосов
/ 02 марта 2019
read_byte1 = serBARC.read(11)

Это блокирующий вызов, и он будет ждать бесконечно до тех пор, пока из порта не будет считано 11 битов.Вместо этого вы можете добавить тайм-аут, а затем сделать то же самое с другим портом:

read_byte1 = serBARC.read(11, timeout=5) # 5 seconds, tweak the timeout as per your liking
read_byte2 = serRFID.read(11, timeout=5)

В качестве альтернативы вы можете указать тайм-ауты при создании обоих объектов Serial, как вы уже сделали для RFIDпорт.Затем вы можете вызвать read для обоих из них в цикле, как я показал выше, но без необходимости указывать тайм-ауты.

Затем можно перейти к проверке того, какой из read_byte1 и read_byte2 имеетнеобходимая длина.

...