树莓派-linux下给特定USB串口或特定设备绑定自定义设备符

树莓派-linux下给特定USB串口或特定设备绑定自定义设备符


当树莓派上插好几个usb串口时,会出现不同的dev,但是有时候拔插某个,其设备符号应该会按顺序重新分配,区分不了设备符和某个usb对应关系,所以就需要将设备符和设备id绑定起来,方便之后的编程了。

存在问题:

后来我测试了相同的usb串口芯片,如CP2102下面的id是一样的,目前没法区分,多个cp2102usb转串口,不能区分!我查看了这几个的详细信息,发现几乎一样。暂时无解,如果是不同型号的usb转串口(PL2303、CH340)这些ID不一样,可以区分,手动设置设备符,不过这个软件上也能获取信息做判断。

查看当前连接USB设备

列出usb设备,列出设备id等简单信息

lsusb

查看结果,其中下面ID:10c4:ea60是我我们需要的usb设备id号

pi@raspberrypi:~ $ lsusb
Bus 001 Device 011: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

查看usb设备详细信息

查看usb设备的详细信息,这里信息只用了( ATTRS{idProduct}==”ea60” ATTRS{idVendor}==”10c4”)

udevadm info --attribute-walk --name=/dev/ttyUSB0 

运行结果(列出了一部分),其中idProduct和idVendor是所需要的设备id号

pi@raspberrypi:~ $ udevadm info --attribute-walk --name=/dev/ttyUSB0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="cp210x"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0':
    KERNELS=="1-1.4:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="cp210x"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{interface}=="CP2102 USB to UART Bridge Controller"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4':
    KERNELS=="1-1.4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="11"
    ATTRS{devpath}=="1.4"
    ATTRS{devspec}=="  (null)"
    ATTRS{idProduct}=="ea60"
    ATTRS{idVendor}=="10c4"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Silicon Labs"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="CP2102 USB to UART Bridge Controller"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="removable"
    ATTRS{serial}=="0001"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="16"
    ATTRS{version}==" 1.10"
    ······

修改或新建USB设备规则

修改usb设备规则文件

sudo vi /etc/udev/rules.d/99-com.rules

添加以下内容,其中ATTRS{idVendor}==”10c4”, ATTRS{idProduct}==”ea60”, MODE:= “0777”,来自上面查看usb设备结果

KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:= "0777", SYMLINK+="ctrl_uart"

新建USB设备规则文件

在/etc/udev/rules.d下建立一个98-com.rules的文件

 sudo vi /etc/udev/rules.d/98-com.rules

在这个空白文件添加

KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:= "0777", SYMLINK+="ctrl_uart"

重启服务,查看是否生效

重启udev服务

 sudo /etc/init.d/udev restart

运行结果:

 pi@raspberrypi:~ $ sudo /etc/init.d/udev restart
[ ok ] Restarting udev (via systemctl): udev.service.

查看结果

ls -l /dev |grep ttyUSB

运行结果:

pi@raspberrypi:~ $ ls -l /dev |grep ttyUSB
lrwxrwxrwx  1 root root           7 Jun 28 06:29 ctrl_uart -> ttyUSB0
crwxrwxrwx  1 root dialout 188,   0 Jun 28 06:29 ttyUSB0

测试代码

使用python,测试串口是否可以正常使用,程序实现了正常的收发,打印接收的数据

# -*- coding: utf-8 -*
import serial
import time
#打开串口
serialPort="/dev/ctrl_uart"   #串口
baudRate=9600       #波特率
ser=serial.Serial(serialPort,baudRate,timeout=0.5)
print "参数设置:串口=%s ,波特率=%d"%(serialPort,baudRate)

def main():
    print("start serial\n")
    while True:
        # 获得接收缓冲区字符
        count = ser.inWaiting()
        if count != 0:
            # 读取收到的内容,并将数据发出去
            recv = ser.read(count)
            ser.write(recv)
            print recv
        # 清空接收缓冲区
        ser.flushInput()
        # 必要的软件延时
        time.sleep(0.1)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        if ser != None:
            ser.close()
            print("close serial\n")
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值