USB转双串口-根据功能绑定串口

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

简介

使用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语言实现,实现方法可以是:

  1. 直接popen调用上面的shell指令,分析返回结果到底是那个COMM口就行了(注意容错)。
  2. 调用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个串口文件。
如下图:
在这里插入图片描述
这回串口会不会乱串呢,还需要验证。


### USB 多串口设备固定分配特定串口解决方案 对于USB多个串口设备时,要实现固定的COM端口分配,可以采用硬件和软件相结合的方法来确保每次连接时都能获得相同的虚拟COM端口编。 #### 方法一:使用具有唯一序列USB集线器或换器 一些高质量的USB串口适配器支持设置唯一的VID(Vendor ID)、PID(Product ID)以及Serial Number属性。当操作系统读取这些参数时,会依据它们创建一致性的映射关系[^1]。因此,在购买此类产品前应确认其具备此功能,并按照厂商说明配置好相应的ID信息。 #### 方法二:编写注册表脚本自动绑定指定驱动程序至具体物理位置 Windows系统允许管理员通过修改注册表的方式强制关联某个具体的USB接口路径与预定义好的COM端口名称。下面是一个简单的PowerShell命令示例用于展示如何操作: ```powershell $usbPath = "USB\VID_XXXX&PID_YYYY" $comPortName = "COM9" # 获取当前已安装的设备列表并过滤出目标USB-to-serial converter $deviceInstanceIds = Get-PnpDevice -Class Ports | Where-Object {$_.InstanceId -like "*$usbPath*"} | Select-Object InstanceId foreach ($deviceId in $deviceInstanceIds){ Set-PnpDeviceProperty -InstanceId $deviceId.InstanceId -KeyName "{8C7ED206-3F8A-4826-B51F-EFDEAD1E2BCC}\{D4AAD102-FABF-4BC8-A0C5-D6DBDDCEBCEF}" -Data ([byte[]](0x0, 0x0, 0x0, [uint32]$comPortNumber)) } ``` 这段代码的作用是从现有的端口中找到匹配给定`$usbPath`模式的对象,然后将其对应的实例ID传递给后续函数调用来更改该对象的相关属性值,从而达到改变默认分配的目的。需要注意的是实际应用过程中可能还需要额外调整其他键值以适应不同版本的操作系统需求。 另外值得注意的是,上述方法适用于Windows平台;如果是Linux或其他类Unix系统,则可以通过udev规则文件来进行类似的定制化处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

化妖成魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值