• 【Jetson】同时配置多个 USB 串口设备,令其端口固定,还可通过别名访问,使用 Jetson 平台


    1 拔掉所有USB并重启设备

    首先,拔掉所有设备,这是为了保证系统在开机时不会去自动的随机分配USB接口号。

    同时,我们使用指令进行验证

    ll /dev/ttyUSB*
    ls: cannot access '/dev/ttyUSB*': No such file or directory
    

    通过返回的消息,可以发现此时没有USB设备连接到我们 Jetson。

    2 依次插上待绑定设备

    我们这里需要绑定的设备有四个,分别是

    1. Ros 扩展板
    2. 语音控制模块
    3. UWB 定位模块
    4. Zigbee 数传模块

    2.1 连接 Ros 扩展板

    2.1.1 查询

    连接好了 Ros 扩展板之后,我们再运行检索 USB 接口的指令

    ll /dev/ttyUSB*
    crwxrwxrwx 1 root dialout 188, 0 929 11:09 /dev/ttyUSB0
    

    会发现此时连接了一个 USB 设备,其编号为 “ttyUSB0”。

    然后,我们先查看HUB板的端口信息,主要是查看设备路径信息,在 Jetson 的终端里输入(注意指令里的 “ttyUSB0” 要正确)

    udevadm info --attribute-walk --name=/dev/ttyUSB0 |grep devpath
    

    我们可以得到如下消息

    jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB0 |grep devpath
    Udevadm info starts with the device specified by the devpath and then
        ATTRS{devpath}=="2.4.2"
        ATTRS{devpath}=="2.4"
        ATTRS{devpath}=="2"
        ATTRS{devpath}=="0"
    

    返回的消息中,ATTRS{devpath}=="2.4.2" 表明了该设备的路径信息。

    2.1.2 绑定

    接下来,我们通过修改 /etc/udev/rules.d/rplidar.rules 文件,从而绑定好 Ros 扩展板的端口号。可以通过在终端中输入

    sudo vim /etc/udev/rules.d/rplidar.rules
    

    在这里插入图片描述
    其中最后边的参数 SYMLINK+="USB_Ros" 是以后要用到的别名,自己可以根据连接的 USB 设备取个名字。

    2.1.3 验证

    重启一下服务,使得修改立即生效。

    sudo udevadm trigger
    

    重启后,我们就完成把 ttyUSB0 取别名为 USB_Ros 的操作了,以后在程序里直接访问 USB_Ros,就可以与这个设备通信了。

    ll /dev/USB_Ros
    lrwxrwxrwx 1 root root 7 929 11:35 /dev/USB_Ros -> ttyUSB0
    

    我们可以看到 USB_Ros 和 ttyUSB0 建立了映射关系。

    2.2 连接语音模块

    jetson@yahboom:~$ ll /dev/ttyUSB*
    crwxrwxrwx 1 root root    188, 0 929 11:35 /dev/ttyUSB0
    crwxrwxrwx 1 root dialout 188, 1 929 11:36 /dev/ttyUSB1
    
    jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB1 |grep devpath
    Udevadm info starts with the device specified by the devpath and then
        ATTRS{devpath}=="2.4.3"
        ATTRS{devpath}=="2.4"
        ATTRS{devpath}=="2"
        ATTRS{devpath}=="0"
    
    jetson@yahboom:~$ sudo vim /etc/udev/rules.d/rplidar.rules
    

    在这里插入图片描述

    jetson@yahboom:~$ sudo udevadm trigger
    
    jetson@yahboom:~$ ll /dev/ttyUSB*
    crwxrwxrwx 1 root root 188, 0 929 11:42 /dev/ttyUSB0
    crwxrwxrwx 1 root root 188, 1 929 11:42 /dev/ttyUSB1
    
    jetson@yahboom:~$ ll /dev/USB_Speech
    lrwxrwxrwx 1 root root 7 929 11:42 /dev/USB_Speech -> ttyUSB1
    
    jetson@yahboom:~$ ll /dev/USB_*
    lrwxrwxrwx 1 root root 7 929 11:42 /dev/USB_Ros -> ttyUSB0
    lrwxrwxrwx 1 root root 7 929 11:42 /dev/USB_Speech -> ttyUSB1
    

    2.3 连接 UWB 定位模块

    jetson@yahboom:~$ ll /dev/ttyUSB*
    crwxrwxrwx 1 root root    188, 0 929 11:42 /dev/ttyUSB0
    crwxrwxrwx 1 root dialout 188, 1 929 11:45 /dev/ttyUSB1
    crwxrwxrwx 1 root dialout 188, 2 929 11:52 /dev/ttyUSB2
    
    jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB2 |grep devpath
    Udevadm info starts with the device specified by the devpath and then
        ATTRS{devpath}=="2.4.4"
        ATTRS{devpath}=="2.4"
        ATTRS{devpath}=="2"
        ATTRS{devpath}=="0"
    
    jetson@yahboom:~$ sudo vim /etc/udev/rules.d/rplidar.rules
    

    在这里插入图片描述

    jetson@yahboom:~$ sudo udevadm trigger
    
    jetson@yahboom:~$ ll /dev/USB_*
    lrwxrwxrwx 1 root root 7 929 11:54 /dev/USB_Ros -> ttyUSB0
    lrwxrwxrwx 1 root root 7 929 11:54 /dev/USB_Speech -> ttyUSB1
    lrwxrwxrwx 1 root root 7 929 11:54 /dev/USB_UWB -> ttyUSB2
    

    2.4 连接 Zigbee 数传模块

    jetson@yahboom:~$ ll /dev/ttyUSB*
    crwxrwxrwx 1 root root    188, 0 929 11:54 /dev/ttyUSB0
    crwxrwxrwx 1 root root    188, 1 929 11:54 /dev/ttyUSB1
    crwxrwxrwx 1 root root    188, 2 929 11:54 /dev/ttyUSB2
    crwxrwxrwx 1 root dialout 188, 3 929 11:55 /dev/ttyUSB3
    
    jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB3 |grep devpath
    Udevadm info starts with the device specified by the devpath and then
        ATTRS{devpath}=="2.4.1"
        ATTRS{devpath}=="2.4"
        ATTRS{devpath}=="2"
        ATTRS{devpath}=="0"
    
    jetson@yahboom:~$ sudo vim /etc/udev/rules.d/rplidar.rules
    

    在这里插入图片描述

    jetson@yahboom:~$ sudo udevadm trigger
    
    jetson@yahboom:~$ ll /dev/USB_*
    lrwxrwxrwx 1 root root 7 929 11:57 /dev/USB_Ros -> ttyUSB0
    lrwxrwxrwx 1 root root 7 929 11:57 /dev/USB_Speech -> ttyUSB1
    lrwxrwxrwx 1 root root 7 929 11:57 /dev/USB_UWB -> ttyUSB2
    lrwxrwxrwx 1 root root 7 929 11:57 /dev/USB_ZigBee -> ttyUSB3
    

    至此,我们就实现了对4个 USB 设备固定端口的设置。需要注意的是,以后不能再随意更改 USB 设备的位置了,否则就会造成设备无法正常工作的情况。

    最后再附一张我手里设备的实物图

    在这里插入图片描述

    3 Bug

    3.1 小车移动程序无效

    按照上述过程修改后,我去操作小车进行移动,发现有个报错

    jetson@yahboom:~/Desktop$ python3 PyTest/RosmasterTest.py 
    Traceback (most recent call last):
      File "/home/jetson/.local/lib/python3.6/site-packages/serial/serialposix.py", line 322, in open
        self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
    FileNotFoundError: [Errno 2] No such file or directory: '/dev/myserial'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "PyTest/RosmasterTest.py", line 4, in <module>
        bot = Rosmaster()
      File "/usr/local/lib/python3.6/dist-packages/Rosmaster_Lib-1.7.3-py3.6.egg/Rosmaster_Lib/Rosmaster_Lib.py", line 20, in __init__
      File "/home/jetson/.local/lib/python3.6/site-packages/serial/serialutil.py", line 244, in __init__
        self.open()
      File "/home/jetson/.local/lib/python3.6/site-packages/serial/serialposix.py", line 325, in open
        raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
    serial.serialutil.SerialException: [Errno 2] could not open port /dev/myserial: [Errno 2] No such file or directory: '/dev/myserial'
    Exception ignored in: <bound method Rosmaster.__del__ of <Rosmaster_Lib.Rosmaster_Lib.Rosmaster object at 0x7faed5d4a8>>
    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/dist-packages/Rosmaster_Lib-1.7.3-py3.6.egg/Rosmaster_Lib/Rosmaster_Lib.py", line 129, in __del__
    AttributeError: 'Rosmaster' object has no attribute 'ser'
    

    分析后发现是串口调用问题。结合小车移动是通过调用 Ros 扩展板来实现的。因此,将问题聚焦在 Ros 扩展板的串口上,也就是我们的 ttyUSB0。

    同时,在报错中看到了 myserial 的字样,这个名字是本来自带的程序中对 Ros 扩展板串口的别名。通过尝试后,我们发现将一开始自己取的 Ros 扩展板别名 “USB_Ros” 改成 “myserial” 中就行了。

    总的来说,Ros 扩展板没问题,修改别名 “USB_Ros” 也没问题。但是一些示例程序中对 Ros 扩展板调用时使用的别名是 “myserial”。如果挨个修改程序中的别名太费事,因此直接将自己想的别名改成示例程序中的别名,那么问题就迎刃而解了。修改界面如下图

    在这里插入图片描述

    Ref.

    1. 2.语音控制模块端口绑定
    2. Jeston nano配置(七)绑定USB设备的串口名称
  • 相关阅读:
    什么是箭头函数
    python处理excel
    数据结构初步(二)- oj练习-时间与空间复杂度
    高成本获客时代,企业如何通过营销自动化实现突围?
    golang的垃圾回收算法之一基本介绍
    .net 温故知新:【9】.NET日志记录 ILogger使用和原理
    常见应用层协议
    Golang 代码调用可视化工具 go-callvis
    如何使用分治算法的思想,分治技巧详解
    Python语言
  • 原文地址:https://blog.csdn.net/weixin_36815313/article/details/127103380