我有一个python程序,它使用pyserial通过USB与arduino UNO进行通信。使用“dev/ttyUSB#”打开com端口效果很好,但是,在arduino中拔出和重新插入时,ttyUSB编号经常发生变化。为了解决这个问题,我决定使用 udev 规则创建一个到 arduino 设备的符号链接。我更新了 python 代码以打开“dev/SYMBOLICLINK”上的端口,但现在收到错误:
“无法配置端口:(25,‘设备的 ioctl 不合适’)。”
有什么方法可以在仍然使用符号链接的同时修复此错误?
当我遇到这个问题时,问题出在
udev
规则上。解决方案是将规则中的SUBSYSTEM=="usb"
更改为SUBSYSTEM=="tty"
。即使通过诸如 $ udevamd info -q all -a <device>
之类的命令,子系统属性似乎是 usb
!
这不一定是原始问题的答案,但我想既然还没有任何答案,我会给出我一直在使用的解决方法。我没有为我想要重用的设备创建 SYMLINK,而是在项目的 settings.json 文件中创建了一个“Devices”对象,类似于以下内容:
"Devices": {
"Custom_name_1": {
"serial_number": ...,
"pid": ...,
"vid": ...
},
"Custom_name_2": {
"serial_number": ...,
"pid": ...,
"vid": ...
},
...
}
然后使用以下函数:
import serial.tools.list_ports as list_ports
import json
def getDeviceMap():
ports = list(list_ports.comports())
with open("./settings.json") as configFile:
configJSON = json.load(configFile)
devices = configJSON["Devices"]
deviceMap = {}
for port in ports:
for device in devices:
deviceData = devices[device]
if port.serial_number == deviceData['serial_number'] and \
port.pid == deviceData['pid'] and \
port.vid == deviceData['vid']:
deviceMap[device] = port.device
return deviceMap
它返回一个看起来像这样的字典:
{"Custom_name_1":"COMX", "Custom_name_2":"COMY"}
如果连接了与定义参数匹配的设备,则打开与该设备关联的端口非常简单。