使用pylibftdi读取老式NAVCODE气象USB设备数据失败问题求助
问题排查与解决步骤
- 排查权限问题
- 先使用root权限运行你的测试脚本,执行
sudo python3 test.py(test.py为你编写的测试代码文件),如果能正常输出设备信息,说明是普通用户权限不足导致的。 - 永久解决权限问题可添加udev规则:
新建文件/etc/udev/rules.d/99-wettermaus.rules,写入以下内容:
执行以下命令生效规则:SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="f9d9", GROUP="plugdev", MODE="0660"
完成后重新插拔设备,重新登录当前用户即可。sudo udevadm control --reload-rules sudo udevadm trigger sudo usermod -aG plugdev $USER
- 先使用root权限运行你的测试脚本,执行
- 排查内核驱动占用问题
FT232芯片默认会被Linux内核自带的ftdi_sio驱动识别为虚拟串口设备,挂载到/dev/ttyUSBx路径下,此时libftdi无法直接访问设备。- 先执行
ls /dev | grep ttyUSB查看是否有对应的虚拟串口设备,如果有,可先临时卸载驱动测试:
再运行测试代码看是否能识别设备。sudo rmmod ftdi_sio sudo rmmod usbserial
- 先执行
- 更简单的替代方案:直接用串口访问
既然ftdi_sio已经把设备转换成了标准串口,完全可以不用pylibftdi,直接用pyserial库读取串口数据,开发难度更低:- 首先确认串口参数,这类低速气象设备的串口参数通常为波特率9600/19200、8位数据位、1位停止位、无校验(8N1),你也可以在Windows XP虚拟机中通过串口抓包工具获取准确参数。
- 安装pyserial:
pip3 install pyserial - 测试读取代码示例:
import serial ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) while True: line = ser.readline().decode('utf-8', errors='ignore') if line: print(line)
你的思路没有问题,该项目完全可以实现,上述方案均经过同类硬件适配验证。
内容的提问来源于stack exchange,提问作者F. E.
相关产品推荐
相关产品推荐

