首页 新闻 会员 周边 捐助

android 每次插拔后USB设备节点ttyUSB名不固定的问题

0
悬赏园豆:100 [待解决问题]

最近在调试android usb转串口的设备,发现插着开机和开机后再插,生成的设备节点不一样,
通常设备节点名为ttyUSBx(x为0~n), 比如第一个插入的设备编号为ttyUSB0,然后依此加1,变为ttyUSB1,ttyUSB2……
如果仅仅以设备节点ttyUSBx来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是ttyUSB0,B设备就是ttyUSB1,
所以如何固定ttyUSB串口节点?

烟雨&任平生的主页 烟雨&任平生 | 初学一级 | 园豆:94
提问于:2023-07-26 21:22
< >
分享
所有回答(2)
0

您可以通过使用 udev 规则来固定 USB 设备的串口节点名。以下是一个基本的流程:

  1. 打开终端并切换到 root 用户或以 sudo 权限运行。
  2. 使用文本编辑器(如 nano、vi 等)创建或编辑一个 udev 规则文件,例如 /etc/udev/rules.d/99-usb-serial.rules
  3. 在规则文件中添加规则,为每个特定设备固定一个串口节点名。规则的格式如下:
    SUBSYSTEM=="tty", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_usb_serial"
    
    其中,xxxxyyyy 是 USB 设备的 Vendor ID 和 Product ID。您可以通过运行 lsusb 命令查看它们。my_usb_serial 是您为设备指定的固定节点名,您可以根据自己的需要进行命名。
  4. 保存并关闭规则文件。
  5. 拔掉 USB 设备,然后重新连接。
  6. 确认设备已被识别,并检查是否生成了预期的固定节点名。

请确保替换规则中的 xxxxyyyy 为您实际设备的 Vendor ID 和 Product ID。通过这种方式,在重启或重新插拔设备后,您应该能够获得持久且一致的串口节点名(例如 /dev/my_usb_serial),以便更方便地区分设备。

请注意,udev 规则的语法和文件位置可能因不同的 Linux 发行版而有所差异。在实际操作过程中,请根据您使用的系统进行相应的调整。

lanedm | 园豆:2396 (老鸟四级) | 2023-07-27 11:21

android支持udev 规则吗?

支持(0) 反对(0) 烟雨&任平生 | 园豆:94 (初学一级) | 2023-07-27 11:32

@鹤鸣&九皋: 有一个通用的方法是使用 udev 规则生成符号链接。

在 Android 系统中,可以通过在 ueventd.rc 文件中定义符号链接来达到类似于 udev 的效果。以下是一个示例:

  1. 打开终端并切换到 root 用户或以 sudo 权限运行。
  2. 使用文本编辑器(如 nano、vi 等)编辑 /ueventd.rc 文件。该文件通常位于 /etc 目录下,但根据 Android 版本和设备可能会有所不同。
  3. 在文件中添加以下规则:
    # 为USB设备创建符号链接
    /dev/ttyUSB*  /dev/my_usb_serial
    
    这样配置之后,每次插拔 USB 设备时,系统会自动为对应的设备节点 /dev/ttyUSB* 创建一个固定的符号链接 /dev/my_usb_serial
  4. 保存并关闭配置文件。
  5. 重新启动 Android 设备以使配置文件生效。

请注意,具体的文件路径和名称可能会因 Android 版本、设备型号和 ROM 自定义而有所差异。在进行任何系统文件修改之前,请务必备份相关文件,并确保您理解操作的潜在风险。

支持(0) 反对(0) lanedm | 园豆:2396 (老鸟四级) | 2023-07-27 11:35

@lanedm: 感谢你的回复,给我了很大的帮助。

支持(0) 反对(0) 烟雨&任平生 | 园豆:94 (初学一级) | 2023-07-27 11:48

@lanedm: 我的是android 8.0 ,/etc路径下找不到ueventd.rc 文件;

支持(0) 反对(0) 烟雨&任平生 | 园豆:94 (初学一级) | 2023-07-27 21:15

@鹤鸣&九皋:
对于Android 8.0,可以尝试以下方法来创建符号链接:

  1. 使用init.rc文件:Android系统的引导过程涉及到init进程,你可以编辑/init.rc/init.${hardware}.rc文件(${hardware}代表特定硬件)来指定需要创建的符号链接。例如,添加类似的条目到rc文件中:
symlink /path/to/target /path/to/symlink
  1. 使用init.d脚本:某些Android设备支持使用init.d目录中的脚本进行初始化。你可以在该目录中创建一个脚本,并在其中使用ln -s命令来创建符号链接。例如,在/system/etc/init.d目录下创建一个脚本 99create_symlinks,并添加以下内容:
#!/system/bin/sh

ln -s /path/to/target /path/to/symlink

重新启动设备后,该脚本将在启动过程中执行,并创建所需的符号链接。

请注意,这些方法可能需要在root权限或系统权限下操作。同时,操作系统和设备型号之间可能存在差异,因此我无法保证这些方法在所有情况下都有效。推荐在尝试之前先备份相关文件并小心处理。如果你对操作系统有更高级的要求,建议咨询专业人士或深入了解特定Android版本的文档和相关资源。

支持(0) 反对(0) lanedm | 园豆:2396 (老鸟四级) | 2023-07-28 08:09
0

在Android系统中,USB设备节点的名字在插拔时确实可能会变化,这可能导致设备混乱并且难以固定。要解决这个问题,你可以通过以下方法来固定USB串口节点:

使用udev规则:如果你的Android设备使用的是Linux内核,你可以通过udev规则来为USB设备创建一个固定的符号链接,从而固定设备节点名。udev规则可以在设备插入时根据设备的唯一属性为其创建一个符号链接。这样,不管设备何时插入,它都会被映射到固定的节点名上。

在Android系统中,你可以将udev规则放在/etc/udev/rules.d/目录下。例如,假设你的USB设备具有唯一的序列号属性,你可以创建一个规则文件(例如99-usb-serial.rules),并在其中添加如下内容:

makefile
Copy code
SUBSYSTEM"tty", ATTRS{idVendor}"XXXX", ATTRS{idProduct}"YYYY", ATTRS{serial}"YOUR_SERIAL_NUMBER", SYMLINK+="ttyUSB_CUSTOM_NAME"
其中,XXXX和YYYY分别是你的USB设备的供应商ID和产品ID,YOUR_SERIAL_NUMBER是你的USB设备的唯一序列号。ttyUSB_CUSTOM_NAME是你希望创建的符号链接名,可以是你自定义的名字,例如my_serial_device。

保存并重新启动udev服务,然后插入USB设备,你应该能够看到一个名为ttyUSB_CUSTOM_NAME的固定设备节点。

使用Android的USBManager API:Android提供了USBManager API,可以帮助你获取连接的USB设备信息,包括供应商ID、产品ID和设备序列号等。你可以在设备插入时检查这些信息,并根据它们来分配一个自定义的设备名称。然后在应用程序中使用这个自定义的设备名称来打开串口。

这种方法需要你的应用程序有USB权限,并且需要在应用程序中处理设备连接和断开事件。

无论使用哪种方法,都需要在Android系统中具有足够的权限来创建udev规则或处理USB设备连接事件。请注意,在不同的Android设备上可能有不同的权限设置和系统限制,因此在进行更改时请谨慎,并确保在测试环境中进行验证。

Technologyforgood | 园豆:7541 (大侠五级) | 2023-07-27 21:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册