Linux 上使用 SYMLINK 的 Pyserial

问题描述 投票:0回答:2

我有一个python程序,它使用pyserial通过USB与arduino UNO进行通信。使用“dev/ttyUSB#”打开com端口效果很好,但是,在arduino中拔出和重新插入时,ttyUSB编号经常发生变化。为了解决这个问题,我决定使用 udev 规则创建一个到 arduino 设备的符号链接。我更新了 python 代码以打开“dev/SYMBOLICLINK”上的端口,但现在收到错误:

“无法配置端口:(25,‘设备的 ioctl 不合适’)。”

有什么方法可以在仍然使用符号链接的同时修复此错误?

symlink pyserial udev
2个回答
0
投票

当我遇到这个问题时,问题出在

udev
规则上。解决方案是将规则中的
SUBSYSTEM=="usb"
更改为
SUBSYSTEM=="tty"
。即使通过诸如
$ udevamd info -q all -a <device>
之类的命令,子系统属性似乎是
usb


-1
投票

这不一定是原始问题的答案,但我想既然还没有任何答案,我会给出我一直在使用的解决方法。我没有为我想要重用的设备创建 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"}

如果连接了与定义参数匹配的设备,则打开与该设备关联的端口非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.