最近在调试android usb转串口的设备,发现插着开机和开机后再插,生成的设备节点不一样,
通常设备节点名为ttyUSBx(x为0~n), 比如第一个插入的设备编号为ttyUSB0,然后依此加1,变为ttyUSB1,ttyUSB2……
如果仅仅以设备节点ttyUSBx来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是ttyUSB0,B设备就是ttyUSB1,
所以如何固定ttyUSB串口节点?
您可以通过使用 udev 规则来固定 USB 设备的串口节点名。以下是一个基本的流程:
/etc/udev/rules.d/99-usb-serial.rules
。SUBSYSTEM=="tty", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_usb_serial"
其中,xxxx
和 yyyy
是 USB 设备的 Vendor ID 和 Product ID。您可以通过运行 lsusb
命令查看它们。my_usb_serial
是您为设备指定的固定节点名,您可以根据自己的需要进行命名。请确保替换规则中的 xxxx
和 yyyy
为您实际设备的 Vendor ID 和 Product ID。通过这种方式,在重启或重新插拔设备后,您应该能够获得持久且一致的串口节点名(例如 /dev/my_usb_serial
),以便更方便地区分设备。
请注意,udev 规则的语法和文件位置可能因不同的 Linux 发行版而有所差异。在实际操作过程中,请根据您使用的系统进行相应的调整。
android支持udev 规则吗?
@鹤鸣&九皋: 有一个通用的方法是使用 udev
规则生成符号链接。
在 Android 系统中,可以通过在 ueventd.rc
文件中定义符号链接来达到类似于 udev 的效果。以下是一个示例:
/ueventd.rc
文件。该文件通常位于 /etc
目录下,但根据 Android 版本和设备可能会有所不同。# 为USB设备创建符号链接
/dev/ttyUSB* /dev/my_usb_serial
这样配置之后,每次插拔 USB 设备时,系统会自动为对应的设备节点 /dev/ttyUSB*
创建一个固定的符号链接 /dev/my_usb_serial
。请注意,具体的文件路径和名称可能会因 Android 版本、设备型号和 ROM 自定义而有所差异。在进行任何系统文件修改之前,请务必备份相关文件,并确保您理解操作的潜在风险。
@lanedm: 感谢你的回复,给我了很大的帮助。
@lanedm: 我的是android 8.0 ,/etc路径下找不到ueventd.rc 文件;
@鹤鸣&九皋:
对于Android 8.0,可以尝试以下方法来创建符号链接:
/init.rc
或/init.${hardware}.rc
文件(${hardware}
代表特定硬件)来指定需要创建的符号链接。例如,添加类似的条目到rc文件中:symlink /path/to/target /path/to/symlink
init.d
目录中的脚本进行初始化。你可以在该目录中创建一个脚本,并在其中使用ln -s
命令来创建符号链接。例如,在/system/etc/init.d
目录下创建一个脚本 99create_symlinks
,并添加以下内容:#!/system/bin/sh
ln -s /path/to/target /path/to/symlink
重新启动设备后,该脚本将在启动过程中执行,并创建所需的符号链接。
请注意,这些方法可能需要在root权限或系统权限下操作。同时,操作系统和设备型号之间可能存在差异,因此我无法保证这些方法在所有情况下都有效。推荐在尝试之前先备份相关文件并小心处理。如果你对操作系统有更高级的要求,建议咨询专业人士或深入了解特定Android版本的文档和相关资源。
在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设备上可能有不同的权限设置和系统限制,因此在进行更改时请谨慎,并确保在测试环境中进行验证。