linux控制USB的绑定/解绑

在这里插入图片描述
Ubuntu USB设备号为从零开始依次累加,当多个设备连接PC时,出现设备号不固定现象,要求工控机每次开机都需要按顺序插。

为了不让我们的usb设备在使用时,由于设备节点注册的ID不同,设备名称会不同,设备如何在 Linux 中永久修改 USB 设备权限。
查看对应的usb端口信息

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

Bus 001 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter

Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub

Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. Hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  ID 1a86:7523 表示usb设备的ID(这个ID由芯片制造商设置,可以唯一表示该设备)
  1a86 usb_device_descriptor.idVendor
 7523 usb_device_descriptor.idProduct

1.创建一个脚本文件

touch create_dashgo_udev.sh
  gedit  create_dashgo_udev.sh
  1. 在文件中添加如下内容
echo  'KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0777", GROUP:="dialout",  SYMLINK+="keysi_base"' >/etc/udev/rules.d/keysi_base.rules

service udev reload
sleep 2
service udev restart

3.查看自己设备的idVendor和idProduct

lsusb -vvv

在这里插入图片描述

上面lsusb的输出中,找出你的 USB 设备,并找出"idVendor"和"idProduct"字段。本例中,我们的结果是idVendor (0x067b)和 idProduct (0x2303)。修改上面的create_dashgo_udev.sh文件

udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
SUBSYSTEMS=="usb"  
        DRIVERS=="cp210x"  
        ATTRS{bInterfaceClass}=="ff"  
        ATTRS{bInterfaceSubClass}=="00"  
        ATTRS{bInterfaceProtocol}=="00"  
        ATTRS{bNumEndpoints}=="02"  
        ATTRS{supports_autosuspend}=="1"  
        ATTRS{bAlternateSetting}==" 0"  
        ATTRS{bInterfaceNumber}=="00"  
        ATTRS{interface}=="CP2102 USB to UART Bridge Controller"  
    KERNEL=="ttyUSB*", KERNELS=="1-2.1", MODE:="0777",SYMLINK+="slamtec_base_"  
    KERNEL=="ttyUSB*", KERNELS=="1-2.2", MODE:="0777",SYMLINK+="slamtec_laser_"

串口找不到 idVendor和idProduct的话,可以

lsusb

  1. .运行脚本
sudo sh create_dashgo_udev.sh

5.查看效果

ls /dev/keysi_base

6.在代码中使用设备名称

 <param name="usart_port"         type="string" value="/dev/keysi_base"/>  
<param name="baud_data"          type="int"    value="115200"/>
<param name="robot_frame_id"     type="string" value="base_link"/>

7.在linux串口工具cutecom中可以查看下位机发送的数据
在这里插入图片描述

总结

列出ttyUSB信息

 ls -l /dev |grep ttyUSB

在这里插入图片描述显示端口信息

udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0

在这里插入图片描述

 lsusb -vvv

在这里插入图片描述编写rules
cd /etc/udev/rules.d
sudo gedit iimt_io.rules

KERNEL=="ttyUSB0",KERNELS=="1-2.1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="usb0_io"
KERNEL=="ttyUSB1",KERNELS=="1-2.2",ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE:="0777", SYMLINK+="usb1_power"

KERNEL=="ttyUSB2",KERNELS=="1-2.4.1",ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="usb2_clean"

KERNEL=="ttyUSB3",KERNELS=="1-2.4.2",ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE:="0777", SYMLINK+="usb3_ultrasonic"
KERNEL=="ttyUSB4",KERNELS=="1-2.4.3",ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="usb4_imu"

ls -l /dev |grep ttyUSB
显示绑定结果
在这里插入图片描述注意:
1同一厂家型号的usb串口idProduct与idVendor序号相同,如果使用同型号的串口,使用KERNELS=="1-2.4.3"来区分(KERNELS使用udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB?来查询)
2本例程中将5个串口(2+2+1)搭载在同一个hub上
3当系统检查到所编写的rules规则有错误时,剩余的端口将不再进行映射。ps:当第一个端口不存在时,后面的端口都将无法映射,除非重新插拔hub
4配置端口映射时,编写完rules后重新插拔usb,端口映射生效,查询KERNELS号后,填入rules文件

5端口使用过程中,若插拔usb端口,则需要注意顺序问题(见3)
6hub重新插拔时自动按顺序启动(所以rules顺序应与hub端口的启动顺序一致)…修改启动顺序,见链接
http://blog.sina.com.cn/s/blog_8b58097f0102wxm3.html

解决问题的思路是:

  1. 第一次上电的时候,我们需要确定哪个端口上的数据是我们所需要的:
    ls -l /sys/class/tty/ttyUSB*
    假设是3-1.1这个端口是我们的data端口。
  2. 以后每次上电,我们要找到3-1.1这个端口后面挂载的ttyUSB设备是ttyUSB0还是ttyUSB1,并建立一个软链接将当时获取到的ttyUSBx生成一个软链接,名字固定为ttydata,那么以后每次打开/dev/ttydata就能找到正确3-1.1这个端口,并获取数据了。
  3. 建立一个文件夹getUSB,该文件夹下面包含:

在这里插入图片描述其中cmd.sh是利用bash脚本获取/sys/class/tty/ttyUSB*的一些信息保存在device_usb.txt中
getUSB.py是通过device_usb.txt中的信息,获取到当前挂着在端口3-1.1上的是ttyUSB0还是ttyUSB1并保存在usbdev 中
cmd.sh如下:

#!/bin/bash
declare -i a=0
declare -i b=0 
while [[ ! -e "/sys/class/tty/ttyUSB0" ]]
do
sudo sleep 0.01s
a=a+1
if [ $a -eq 300 ];then  #等待一段时间没有检测ttyUSB0设备到会自动跳出while
break
fi
done

while [[ ! -e "/sys/class/tty/ttyUSB1" ]]
do
sudo sleep 0.01s
b=b+1
if [[ $b -eq 300||$a -ne 0 ]];then  #if USB0 been detected ,also get out of while
break
fi
done


if [[ ! -e /sys/class/tty/ttyUSB0&&! -e /sys/class/tty/ttyUSB1 ]]; then #如果不存在ttyUSB设备
echo "Not have ttyUSB0 or not have ttyUSB1"
else                                   #如果完美检测到了两个ttyUSB设备,则将信息log到device_usb.txt当中
tty1=$(ls -l /sys/class/tty/ttyUSB0) 
tty2=$(ls -l /sys/class/tty/ttyUSB1)

sudo ls -l /sys/class/tty/ttyUSB0 /sys/class/tty/ttyUSB1 > ./device_usb.txt
fi

if [ ! -n "$tty1" ] ;then   # "! -n" shows blank var  #非空检测
echo "tty1 is empty"
fi
#delay 0.01s to make sure the device_usb.txt complete
sudo sleep 0.01s
#remove the old USB device shortcut

if [ ! -e "/dev/ttydata" ] ;then # 如果/dev/ttydata本身不存在
echo "-------------/dev/ttydata not found"
else                                     #如果存在,则需删除之,然后重新创建之
echo "/dev/ttydata is exist"
sudo rm /dev/ttydata
fi

#exct Python language to get the rignt USB interface
./getUSB.py    #调用当前路径下的getUSB.py这个Python语言,明确此次是哪个,ttyUSB0,或者ttyUSB1挂载在端口3-1.1上

usbdev=$(cat ./usbdev) #获取到这个设备
echo "the device is : "
echo $usbdev
sudo ln -s /dev/$usbdev /dev/ttydata #将这个设备软连接到/dev/ttydata以后每次打开这个ttydata即可

getUSB.py:

#!/usr/bin/python
#coding:utf-8
import re  #正在表达式
sss = open("./device_usb.txt","rb") #打开device_usb.txt设备,并读取内容
www = open("./usbdev","wb")  #当前路径下创建usbdev文件,后续会写入内容
s_read = sss.read()  usb3/3-1/3-1.1/
r = r"usb3/3-1/3-1\.1.+(ttyUSB[0-9])"
#正则中“.”需要转义,所以使用“\.”表示“.”
#这个规则是找到usb3/3-1/3-1.1/这个字符串后面紧跟的是此次上电生成的ttyUSB0或者ttyUSB1
output = re.findall(r,s_read)
www.write(output[0]) #将结果写到usbdev中
www.close()
sss.close()

完成之后设置开机项目,将文件夹当道一个位置,然后设置开机启动cmd.sh(在/etc/rc.local中设置)则每次开机之后,会从/dev/ttydata获取到固定端口的数据

上面的方法虽然ok,然而,有时候ubuntu开机不是按usb口顺序启动哒,无奈对于linux硬件外设的修炼不够,所以,我在软件里添加串口检测并且绑定啦,妥妥地安全可靠。嘻嘻嘻!!!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DPDK是一种开源的数据包处理框架,它能够大大提升数据包处理的速度以及效率。DPDK的性能在很大程度上依赖于它与网络接口卡的配合。为了最大化性能,需要将网络接口卡绑定到DPDK上。 DPDK在绑定网卡时,需要先在Linux系统中安装igb_uio驱动程序。然后,可以使用DPDK自带的绑定脚本进行绑定,如下所示: ./usertools/dpdk-devbind.py --bind=igb_uio eth0 其中,“eth0”为需要绑定的网卡名。绑定完成后,可以使用DPDK提供的性能测试工具来测试性能。 需要注意的是,在绑定之前,应先停止任何已经在使用该网卡的服务或应用程序。在绑定过程中,还要确保正确配置DPDK环境变量,如DPDK_SDK和RTE_SDK等。此外,在绑定完成后还需要检查网卡是否成功被绑定。 如果需要解绑,可以使用同样的绑定脚本来进行操作,只需要将命令中的“bind”替换为“unbind”,如下所示: ./usertools/dpdk-devbind.py --unbind eth0 绑定解绑过程需要小心谨慎,否则可能会导致系统崩溃或者网络故障。因此,在操作前应先确认自己掌握了足够的知识和经验,才能进行相应的操作。 ### 回答2: DPDK是一种高性能数据平面开发工具集,可以用于加速包处理和数据包转发。绑定解绑网络接口是DPDK的重要功能,它可以为应用程序提供更高效的包处理和网络传输能力。 网卡绑定是将DPDK与物理网卡连接起来的过程。通常情况下,DPDK使用IGB UIO模块将物理网卡作为DPDK的虚拟设备进行管理。网卡绑定的过程包括以下几个步骤: 1. 加载IGB UIO驱动程序:使用modprobe命令加载驱动程序,驱动程序所在路径在DPDK目录下的x86_64-native-linuxapp-gcc/kmod目录中。 2. 绑定网卡到UIO驱动程序上:使用DPDK提供的dpdk-devbind工具,输入命令进行网卡与驱动程序的绑定,如:./dpdk-devbind --bind=uio_pci_generic eth0。 3. 初始化DPDK虚拟设备:使用DPDK提供的脚本,输入命令进行虚拟设备的初始化,如:./usertools/dpdk-devbind.py -s。 网卡解绑是将DPDK与物理网卡连接断开的过程。解绑网卡的过程包括以下几个步骤: 1. 停止DPDK进程:使用DPDK提供的脚本,输入命令停止DPDK进程,如:./usertools/dpdk-devbind.py --status。 2. 解绑网卡:使用DPDK提供的dpdk-devbind工具,输入命令解绑网卡,如:./dpdk-devbind --unbind eth0。 3. 卸载IGB UIO驱动程序:使用rmmod命令卸载驱动程序,如:rmmod uio_pci_generic。 绑定解绑网卡的操作可以通过脚本进行自动化,以提高效率和可靠性。同时也需要注意,绑定解绑不当会导致系统网络异常,因此需要进行充分测试和验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值