问题:我正在做一个班级项目,创建一个 Flask 项目,除其他外,从 USB RFID 阅读器读取数据。当 Flask 应用程序运行并且我用阅读器扫描徽章时它抛出异常:
serial.serialutil.SerialException:设备报告准备好读取但未返回任何数据(设备断开连接或端口上的多重访问?)
多次(读者在连续循环中被收听)。
环境:
Ubuntu 22.04
Python 3.10.6
测试: 验证读卡器是否正常工作并通过以下方式连接:
sudo cat /dev/ttyUSB0
这会在扫描徽章时向终端产生预期的输出。 使用更改端口权限:
sudo chmod a+rw /dev/ttyUSB0
已验证测试脚本可以按预期在循环中访问阅读器。 验证循环在没有线程的 Flask 应用程序中按预期工作。
评论: https://realpython.com/intro-to-python-threading/
Python 从串口读取(增加超时给了我“从串口读取数据时出错:int() 的无效文字,基数为 16:''”;我尝试的其他方法使原始错误恢复原状。
Python SerialException:设备报告准备好读取但未返回任何数据(设备已断开连接?)
我的代码:
import serial
import threading
ser_lock = threading.Lock()
# Function for reading from serial port
def serial_data():
PORT = "/dev/ttyUSB0" # Hardcoded for now - needs to be fixed - menu?
BAUD = 9600
ser = None
try:
ser = serial.Serial(port=PORT, baudrate=BAUD, timeout=2)
while True:
try:
with ser_lock:
print("Locked!")
data = ser.readline().decode().strip()
if not data:
print("No data read!")
continue
clean = data[2:] # Remove add'l chars '\x'
clean_int = int(clean, 16) # Convert to base 16 int
card_number = (clean_int >> 1) & 0x7FFFF # Bitshift to remove parity and mask to isolate 19 bits
facility_code = (clean_int >> 20) & 0xFFFF # Same for facility code
print(card_number) # Verified when tested with my badge
print(facility_code) # Not verified - No idea what my facility code should be
except Exception as e:
print(f"Error reading data from serial port: {str(e)}")
continue
except Exception as e:
print("Error opening port: " + str(e))
从Flask app调用我的代码的相关代码:
def start_reader():
thread = Thread(target=serial_data)
thread.daemon = True
thread.start()
start_reader()# Call the above function when the app starts
预期行为:当 Flask 应用程序运行时,我的 RFID 阅读器连接到端口 /dev/ttyUSB0,应用程序将打印徽章信息到控制台。
实际行为:当应用程序正在运行且未扫描徽章时,锁定!打印语句和没有读取数据!打印语句按预期执行。扫描徽章时,这是输出:
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Locked!
Error reading data from serial port: invalid literal for int() with base 16: ''
Locked!
No data read!
Locked!
Error reading data from serial port: invalid literal for int() with base 16: ''
Locked! # Here it returns to the earlier expected looping print statements
附加信息:当应用程序和模块在没有线程的情况下编写时,阅读器模块按预期工作,但会阻止 Flask 应用程序的其余部分运行(因此需要线程)。这告诉我阅读器已连接到计算机,并且在一个简单的脚本中应用程序可以从中读取并强烈表明问题出在线程和并发性上——我走对了吗?
错误是关于打印语句,而不是串口。通过队列将值传回主线程解决了错误。