树莓派双RFID阅读器USB设备号互换问题求助
解决树莓派RFID阅读器重启后hidraw设备名互换的问题
这个问题很常见,本质是Linux下USB设备的动态命名机制导致的——每次重启后内核枚举设备的顺序可能变化,所以hidraw编号会互换。解决的核心思路是给每个阅读器绑定固定的符号链接,不管内核给它分配什么hidraw编号,你都能用统一的名字访问。具体步骤如下:
1. 获取两个阅读器的唯一标识
首先得拿到每个设备的专属识别信息,确保udev能精准区分它们。
- 先单独插上第一个阅读器(reader1),运行以下命令查看设备属性:
你会得到类似这样的输出:udevadm info -a -n /dev/hidraw0 | grep -E '(idVendor|idProduct|serial)'ATTRS{idVendor}=="1234" ATTRS{idProduct}=="5678" ATTRS{serial}=="ABC123XYZ" - 拔掉第一个,插上第二个阅读器(reader2),重复上述命令(注意此时设备可能是/dev/hidraw0或hidraw1),记录它的
idVendor、idProduct和serial值。
注意:如果两个阅读器的
idVendor和idProduct完全相同,必须依赖serial号来区分;如果设备没有serial号,可以用物理端口属性(比如ATTRS{phys}),但serial号是最可靠的唯一标识。
2. 创建udev规则文件
udev是Linux管理设备的子系统,我们可以通过规则让它给指定设备创建固定的符号链接。
- 创建一个新的udev规则文件:
sudo nano /etc/udev/rules.d/99-rfid-readers.rules - 在文件中添加以下内容,把占位符替换成你刚才记录的实际值:
# 绑定输入阅读器reader1到固定链接/dev/rfid-reader-input SUBSYSTEM=="hidraw", ATTRS{idVendor}=="你的reader1的VID", ATTRS{idProduct}=="你的reader1的PID", ATTRS{serial}=="你的reader1的serial", SYMLINK+="rfid-reader-input" # 绑定输出阅读器reader2到固定链接/dev/rfid-reader-output SUBSYSTEM=="hidraw", ATTRS{idVendor}=="你的reader2的VID", ATTRS{idProduct}=="你的reader2的PID", ATTRS{serial}=="你的reader2的serial", SYMLINK+="rfid-reader-output" - 保存并退出编辑器(nano中按
Ctrl+O,回车确认,再按Ctrl+X)。
3. 加载新规则并验证
- 重新加载udev规则,让新配置生效:
sudo udevadm control --reload-rules sudo udevadm trigger - 同时插上两个阅读器,查看/dev目录下的符号链接:
你应该能看到类似这样的输出,说明符号链接已经正确绑定到对应的hidraw设备:ls -l /dev/rfid-*lrwxrwxrwx 1 root root 7 月 10 15:30 /dev/rfid-reader-input -> hidraw0 lrwxrwxrwx 1 root root 7 月 10 15:30 /dev/rfid-reader-output -> hidraw1
4. 修改代码中的设备路径
最后,把你代码里原来的/dev/hidraw0和/dev/hidraw1,分别替换成/dev/rfid-reader-input和/dev/rfid-reader-output。这样不管树莓派重启多少次,系统都会通过固定的符号链接找到对应的阅读器,再也不会混淆输入输出功能了。
内容的提问来源于stack exchange,提问作者Alexandre Barbosa Gontijo
相关产品推荐
相关产品推荐

