获取Linux系统上所有可用串行端口/设备列表的正确方法是什么?
换句话说,当我迭代所有设备时/dev/,如何以经典的方式判断哪些是串行端口,即那些通常支持波特率和RTS/CTS流控制?
解决方案将用C编码.
我问,因为我正在使用第三方库,这显然是错误的:它似乎只是迭代/dev/ttyS*.问题是,例如,USB上的串行端口(由USB-RS232适配器提供),并且这些端口列在/ dev/ttyUSB*下.在Linux.org上阅读Serial-HOWTO,我认为随着时间的推移,还会有其他名称空间.
所以我需要找到检测串行设备的官方方法.问题是似乎没有记录,或者我找不到它.
我想有一种方法是打开所有文件/dev/tty*并调用特定的文件,这些文件ioctl()仅在串行设备上可用.那会是一个很好的解决方案吗?
hrickards建议查看"setserial"的来源.它的代码完全符合我的想法:
首先,它打开一个设备:
fd = open (path, O_RDWR | O_NONBLOCK)
Run Code Online (Sandbox Code Playgroud)
然后它调用:
ioctl (fd, TIOCGSERIAL, &serinfo)
Run Code Online (Sandbox Code Playgroud)
如果该调用没有返回错误,那么它显然是一个串行设备.
我在Serial Programming/termios中找到了类似的代码,建议也添加该O_NOCTTY选项.
但是,这种方法存在一个问题:
当我在BSD Unix(即Mac OS X)上测试此代码时,它也能正常工作.但是,通过蓝牙提供的串行设备会导致系统(驱动程序)尝试连接到蓝牙设备,这需要一段时间才能返回超时错误.这是因为只需打开设备即可.我可以想象在Linux上也会发生类似的事情 - 理想情况下,我不需要打开设备来弄清楚它的类型.我想知道是否还有一种方法可以在ioctl没有打开的情况下调用函数,或者以不会导致连接的方式打开设备?
我该怎么办?