【发布时间】:2011-01-05 20:20:41
【问题描述】:
我正在为 Linux 设备编写 IO 例程,该设备将连接各种不断变化的 USB 设备。为此,我需要能够确定哪个设备连接到哪个端口,以便我可以使用正确的软件打开它。类似于“udevinfo”的东西是理想的,但我不知道如何开始写这样的东西。
关于 c++ api 阅读的建议?
【问题讨论】:
-
我同意 341008。一票投给他。
我正在为 Linux 设备编写 IO 例程,该设备将连接各种不断变化的 USB 设备。为此,我需要能够确定哪个设备连接到哪个端口,以便我可以使用正确的软件打开它。类似于“udevinfo”的东西是理想的,但我不知道如何开始写这样的东西。
关于 c++ api 阅读的建议?
【问题讨论】:
看看libudev++。这似乎就是您要找的东西。
【讨论】:
见libusb的libusb_get_device_list、libusb_get_bus_number、libusb_get_device_address。
【讨论】:
GIO 应该可以帮助你。连接到volume-added 和volume-removed 信号将提醒您的程序注意系统中添加或删除的任何存储设备。如果您不需要 GIO 提供的控制级别,您可以使用libudev++,它提供了对 GIO 的高级封装。
【讨论】:
我不知道你需要什么样的信息,但你可以通过 /sys/bus/usb 吗?
【讨论】:
我最终在 chkconfig 文件中使用了 BASH 解决方案。我浏览所有 ttyUSB 条目并查看每个条目的驱动程序信息:
USB_ID=`egrep -i "mct u232|pl2303|keyspan" -m 1 /proc/tty/driver/usbserial | awk '{ printf( "$d", $1 )}'`
if [ -z $USB_ID ]
then
echo $echo_n "No USB serial adapter found.";
exit 1
fi
【讨论】:
最近的解决方案:
遍历这些文件系统目录:
/dev/serial/by-id
/dev/snd/by-id
/dev/disk/by-id
/dev/input/by-id
/dev/v4l/by-id
取决于您要查找的设备类别。
例如,为我的 Arduino Nano 寻找串口:
#include <filesystem>
#include <string>
const std::string path = "/dev/serial/by-id";
for( const auto & file : std::filesystem::directory_iterator( path ) )
{
const std::string s = "NANO_33_IoT";
if( file.path().generic_string().find(s) )
{
return file.path();
}
}
【讨论】: