简介
使用CP2102N芯片的USB转双串口电路板,插入到linux系统后,会自动识别到ttyUSB0和ttyUSB1两个设备文件,在/dev/文件夹下。
通常情况下,系统不能保证这两个设备文件是永远不变的。因此需要方法,根据功能绑定固定的串口,无论ttyUSB0或ttyUSB1如何改变,都能找到正确的串口去实现相应的功能。
通过by-path软连接绑定功能口
ll /dev/serial/by-path

由于 USB 转串口设备,每个小板的序列号都不相同,因此前面利用/dev/serial/by-id的方法并不能有效的绑定管理口与打印口。
通过查询资料,我们还有一个方法可以绑定管理口与打印口。
即利用/dev/serial/by-path中的软连接,直接打开操作串口。
/dev/serial/by-path中的软连接,是根据串口的物理总线拓补结构生成的。原则上,主板不变,插口不变,软连接就不会改变。
软连接组成: pci总线中的位置-usb总线中的位置-端口号 三部分组成。
C语言使用方法:
直接
open(“/dev/serial/by-path/软连接1”) 或
open(“/dev/serial/by-path/软连接2”)
替换掉
open(“/dev/ttyUSB0”) 或
open(“/dev/ttyUSB1”)
打开串口,其余不变。
由于目前ttyUSB0 和 ttyUSB1是正确的,所以替换后,以后就算ttyUSB0和ttyUSB1变换成任何设备名称,只要串口的物理拓补路径不变,则软连接就应该保持不变。
通过by-id软连接绑定功能口
USB转双串口,会在linux的/dev/serial/by-id下生成2个软连接,如下图:
ll /dev/serial/by-id

格式为: 软连接名称 -> 目标名称。
注意:2个软连接名称中分别包含了
c09dd83b8b37ec11ae4a4b2bb659684c d639c11b7f37ec119638492bb659684c
序列号。
这2个序列号是不变的。
所以,可以通过匹配包含这2个序列号的软连接的方式,逆向找到对应的ttyUSBx设备,x为任意值,随便怎么变都可以。
例子:
假设包含c09dd83b8b37ec11ae4a4b2bb659684c的软连接对应的ttyUSB设备是管理口,则shell指令如下:
mgr_comm=`find /dev/serial/by-id -name *c09dd83b8b37ec11ae4a4b2bb659684c* | xargs readlink -f`
假设包含d639c11b7f37ec119638492bb659684c的软连接对应的ttyUSB设备是管理口,则shell指令如下:
prt_comm=`find /dev/serial/by-id -name *d639c11b7f37ec119638492bb659684c* | xargs readlink -f`
上面2个命令中的序列号互换后,相应的管理口和打印口也互换了。
以上为直接用shell的方式确认管理口和打印口。
如果用C语言实现,实现方法可以是:
- 直接popen调用上面的shell指令,分析返回结果到底是那个COMM口就行了(注意容错)。
- 调用C语言api, 先查找/dev/serial/by-id下的包含指定序列号的软连接,然后根据软连接找到对应的设备文件。
进一步绑定物理口
由于测试过程中,发现通过by-path板顶,pci总线拓补那部分在不同的机器上不一样,是可以变动的。
后来我查询了下资料,没查到变动的具体原因。
但是,我查到usb总线部分的拓补大概率是不变的。
而且可以简化操作。即利用udev rules文件,把USB总线拓补绑定到别名。
具体步骤如下:
分别用udevadm命令搜寻KERNELS,命令如下图:

注意第二行,“1-7:1.0” 和 “1-8:1.0”, 这个就是这个设备的总线拓补。
创建udev的rules文件,内容如下:

分别根据2个物理拓补,创建2个别名,ttyK1和ttyK2, 你们可以随便命名,如ttyPRT, ttyMGR等。
重启机器后,查看/dev目录,会多出/dev/ttyK1和/dev/ttyK2 2个串口文件。
如下图:

这回串口会不会乱串呢,还需要验证。
完
!
文章介绍了在Linux系统中,使用CP2102N芯片的USB转双串口设备时,如何通过by-path和by-id软连接来绑定固定的功能串口。尽管ttyUSB0和ttyUSB1设备文件可能变化,但通过识别设备的物理总线拓扑或序列号,可以确保始终能找到正确的串口。此外,还提到了使用udevrules创建别名来进一步稳定串口绑定的方法。
374

被折叠的 条评论
为什么被折叠?



