使用Node.js的usb库获取设备串行路径的方法咨询
问题解答
首先明确:Node.js的usb库本身无法直接获取/dev/ttyACM0这类串行设备路径,因为这类路径是操作系统为USB串口设备创建的设备节点,属于系统层面的设备管理范畴,和USB硬件的bus/address/port信息没有直接的内置映射关系。
不过你手里的busNumber、deviceAddress、portNumbers参数可以用来间接匹配到对应的串行路径,以下是可行的实现思路:
Linux 环境下的实现方式
Linux系统会在/dev/serial/by-path/目录下创建与USB总线、端口绑定的符号链接,这些链接的名称包含了USB总线号、端口序列等信息,正好可以和你已有的参数匹配:
- 使用Node.js的
fs模块遍历/dev/serial/by-path/目录下的所有文件 - 解析每个链接的名称:比如链接名可能是
pci-0000:00:14.0-usb-0:1:1.0,其中usb-0:1部分的第一个数字对应busNumber,后续的数字序列对应portNumbers(比如portNumbers为[1]的话,对应:1) - 找到匹配的链接后,调用
fs.readlink()获取该链接指向的目标路径,就是你要的/dev/ttyACM0这类串行路径
示例代码片段:
const fs = require('fs').promises; const path = require('path'); async function getSerialPath(busNumber, portNumbers) { const serialPathDir = '/dev/serial/by-path/'; const entries = await fs.readdir(serialPathDir); for (const entry of entries) { // 匹配链接名中的usb总线和端口信息 const match = entry.match(new RegExp(`usb-${busNumber}:${portNumbers.join('.')}`)); if (match) { const fullLinkPath = path.join(serialPathDir, entry); const serialPath = await fs.readlink(fullLinkPath); return path.resolve('/dev/', serialPath); } } return null; // 未找到匹配的串行路径 }
其他系统的适配思路
- macOS:系统会在
/dev/下生成/dev/tty.usbmodemXXXX或/dev/cu.usbmodemXXXX这类路径,你可以通过/dev/serial/by-path/或/dev/serial/by-id/目录做类似的符号链接匹配 - Windows:串行路径是
COMx格式,需要通过读取注册表或调用WMI接口,结合USB设备的bus/port信息来匹配对应的串口编号
额外提示
如果你的USB串口设备有固定的VID(厂商ID)和PID(产品ID),也可以通过调用系统命令(比如lsusb、dmesg)结合child_process模块来查找对应的串行路径,这种方式有时会更可靠。
内容的提问来源于stack exchange,提问作者pawcio
相关产品推荐
相关产品推荐

