在我们的 Linux 机器中,我们有 USB -> 串行设备,它总是被标识为
/dev/ttyACM0
. 所以我写了一个应用程序,直到昨天,一切正常。但突然(是的,在远程演示期间......)设备停止工作。经过快速研究,我发现连接更改为/dev/ttyACM1
. 这有点不合时宜,但现在我有一个问题 - 如何明确识别我的设备?例如,尽管 UUID/dev/sd**
已更改,但可以使用 UUID 初始化存储驱动器。有没有办法为串行设备做到这一点?
现在我使用一个愚蠢的解决方法:
for(int i = 0; i < 10; i ++)
{
m_port = std::string("/dev/ttyACM") + (char)('0' + i);
m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}
我们使用的设备的链接。
由于我们正在讨论 USB 设备并假设您有 udev,您可以设置一些 udev 规则。
我猜,这只是一个疯狂的猜测,有人或某物拔下/移除了设备并将其重新插入/再次添加设备,这会增加数字。
现在,首先您需要供应商和产品 ID:
接下来,您需要序列号(如果您有多个):
现在,让我们创建一个 udev 规则:
UDEV 规则通常分散在
/etc/udev/rules.d
. 创建一个名为的新文件99-usb-serial.rules
并将以下行放入其中,我有三个设备,每个设备都有一个不同的序列号:如果您不想要序列号,则来自具有相同芯片的供应商的任何设备都将获得相同的符号链接,在任何给定时间只能插入一个。
取自这里
UDEV 规则是个好主意,但许多设备没有序列号或具有相同的序列号,这并不能解决 ttyACM0 到 ttyACM1 的问题
尝试
PS我不是魔术师,我只是在学习,但友谊可以帮助我们创造真正的奇迹