如何从Python中的多个串行输入读取?

时间:2019-03-02 09:28:06

标签: python pyserial

我正在尝试读取两个串行端口以获取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

以上方法有效,但显然仅适用于条形码读取器。如果我在“ readtag”定义中更改为serRFID而不是serBARC,它也可以工作,但我希望两者都被读取,并且只有返回数据(RFID或条形码)的那个才能存储为“ tag_inp”

1 个答案:

答案 0 :(得分:0)

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_byte1read_byte2中的哪一个具有所需的长度。