You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js的usb库获取设备串行路径的方法咨询

问题解答

首先明确:Node.js的usb库本身无法直接获取/dev/ttyACM0这类串行设备路径,因为这类路径是操作系统为USB串口设备创建的设备节点,属于系统层面的设备管理范畴,和USB硬件的bus/address/port信息没有直接的内置映射关系。

不过你手里的busNumber、deviceAddress、portNumbers参数可以用来间接匹配到对应的串行路径,以下是可行的实现思路:

Linux 环境下的实现方式

Linux系统会在/dev/serial/by-path/目录下创建与USB总线、端口绑定的符号链接,这些链接的名称包含了USB总线号、端口序列等信息,正好可以和你已有的参数匹配:

  1. 使用Node.js的fs模块遍历/dev/serial/by-path/目录下的所有文件
  2. 解析每个链接的名称:比如链接名可能是pci-0000:00:14.0-usb-0:1:1.0,其中usb-0:1部分的第一个数字对应busNumber,后续的数字序列对应portNumbers(比如portNumbers为[1]的话,对应:1)
  3. 找到匹配的链接后,调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:07:19