获取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没有打开的情况下调用函数,或者以不会导致连接的方式打开设备?
我该怎么办?
我开发嵌入式系统并需要串行端口进行通信.
在Windows XP中,USB串行端口加密狗的数字不断移动,这使得它很难在脚本或makefile中使用(例如,通过内置的引导加载程序对NXP控制器进行闪存编程,或者用于控制目标和两个实验室设备)同时).
有没有办法修复这种加密狗的COM端口?在Linux中,我可以通过对FTDI加密狗的序列号相匹配(请参见通过的udev做这个答案,我只是给了,而寻找一个回答这个问题).