树莓派通过python-mercuryapi连接M6e RFID阅读器遇UART超时错误
树莓派UART连接M6e RFID阅读器触发python-mercuryapi超时错误
初始化mercury.Reader对象时,树莓派通过UART与M6e RFID阅读器通信失败,触发超时错误,表现与UART未连接任何设备时的错误一致。
错误信息
pi@raspberrypi:~/code/python/mercury-rfid $ python Python 3.7.3 (default, Jan 22 2021, 20:04:44) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import mercury >>> reader = mercury.Reader("tmr:///dev/ttyS0", baudrate=115200) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Timeout >>>
系统环境
- 树莓派3B/3B+(两者均测试)
- Sparkfun M6 nano RFID阅读器
- 基于Debian Buster的Raspbian系统
- Python 3.7.3
- 通过
pip install python-mercuryapi -b $HOME/tmp安装python-mercuryapi
已完成的排查操作
- 树莓派UART功能正常,已成功通过UART与Arduino通信(测试代码见文末)
- 已修改树莓派配置,启用UART并禁用Linux串行控制台
- Pi用户已加入dialout组
- 阅读器及API功能正常,使用FTDI USB转串口适配器可成功扫描标签
- 修改阅读器的TXB0104,将VCCB与OE引脚焊接以禁用5V-3.3V隔离、改用3.3V;该配置通过FTDI适配器3.3V模式可正常工作,但超时问题未解决
- 更换全新树莓派3B+重复排查,问题依旧
可能的解决方向
1. 确认UART设备路径与分配
树莓派3B/3B+上,/dev/ttyS0是性能受限的迷你串口,/dev/ttyAMA0是主UART。尝试将初始化路径改为"tmr:///dev/ttyAMA0",同时在raspi-config的Interface Options -> Serial Port中,选择"否"禁用控制台、"是"启用串口,确保主UART分配给GPIO引脚而非蓝牙。
2. 延长初始化超时时间
python-mercuryapi的Reader初始化支持timeout参数,尝试延长超时阈值:
reader = mercury.Reader("tmr:///dev/ttyS0", baudrate=115200, timeout=5)
3. 验证接线与信号完整性
- 确认树莓派TXD接阅读器RXD、RXD接阅读器TXD,必须连接共地引脚
- 用逻辑分析仪或示波器验证树莓派发送的信号是否被阅读器正确接收,反之亦然,排除电平匹配或接线故障
4. 手动重置阅读器
初始化前通过GPIO引脚触发阅读器重置,确保设备处于就绪状态:
import RPi.GPIO as GPIO import mercury import time # 假设重置引脚接GPIO17,根据实际接线调整 GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) GPIO.output(17, GPIO.LOW) time.sleep(0.1) GPIO.output(17, GPIO.HIGH) time.sleep(0.5) reader = mercury.Reader("tmr:///dev/ttyAMA0", baudrate=115200)
5. 从源码编译安装API
尝试从源码编译安装,确保适配树莓派硬件环境:
git clone https://github.com/gotthardp/python-mercuryapi.git cd python-mercuryapi pip install -e .
树莓派与Arduino的UART测试代码
import time import serial ser = serial.Serial( port='/dev/serial0', baudrate = 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) while 1: ser.write('Hello\n') time.sleep(1)
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

