我正在尝试读取两个串行端口以获取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”
答案 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_byte1
和read_byte2
中的哪一个具有所需的长度。