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

Linux下Python识别Arduino(HL-340)串口设备问题及方案咨询

问题解答

一、能否通过Arduino IDE编译时设置设备名称?

不行。你看到的设备名称(如USB2.0-Ser!)是由HL-340 USB转串口芯片的固件决定的,和Arduino主控板上运行的程序无关。Arduino IDE编译上传的代码只作用于单片机,无法修改USB转串口芯片的内置固件参数。除非你能重新烧写HL-340的固件,但这操作门槛高且有损坏芯片的风险,不推荐普通用户尝试。

二、Python脚本识别Arduino设备的更优方法

1. 基于USB厂商ID(VID)和产品ID(PID)匹配

这是最可靠的方法,每个USB设备的VID和PID是唯一标识,不受系统或驱动描述信息的影响。

  • 先通过Linux的lsusb命令获取HL-340的VID和PID,比如输出中ID 1a86:7523里的1a86是VID,7523是PID(替换成你实际查到的数值)。
  • 用pyserial过滤对应VID和PID的设备:
import serial.tools.list_ports

def find_target_arduino():
    # 替换为你的HL-340的VID和PID(十六进制)
    target_vid = 0x1a86
    target_pid = 0x7523
    for port in serial.tools.list_ports.comports():
        if port.vid == target_vid and port.pid == target_pid:
            return port.device
    return None

device_path = find_target_arduino()
if device_path:
    print(f"找到目标设备:{device_path}")
else:
    print("未匹配到目标设备")

2. 利用Linux udev规则创建固定设备链接

通过udev规则给HL-340设备绑定一个固定的符号链接,比如/dev/arduino,Python脚本直接访问该路径即可,无需动态识别。

  • 新建udev规则文件:sudo nano /etc/udev/rules.d/99-arduino-hl340.rules
  • 写入以下内容(替换为你的VID和PID):
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="arduino"
  • 重启udev服务生效:
sudo udevadm control --reload-rules && sudo udevadm trigger

之后设备连接时会自动生成/dev/arduino,Python脚本直接使用这个路径即可。

3. 通过串口指令交互识别

如果Arduino设备上运行的程序支持自定义指令,可以通过发送指令并校验响应来识别设备,适合多串口设备共存的场景。

  • Arduino端代码示例:
void setup() {
  Serial.begin(9600);
  while (!Serial); // 等待串口连接
}

void loop() {
  if (Serial.available() > 0) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim();
    if (cmd == "WHOAMI") {
      Serial.println("HL340_ARDUINO");
    }
  }
}
  • Python端识别脚本:
import serial
import serial.tools.list_ports
import time

def find_arduino_by_cmd():
    baud_rate = 9600
    for port in serial.tools.list_ports.comports():
        try:
            ser = serial.Serial(port.device, baud_rate, timeout=2)
            time.sleep(2)  # 等待串口初始化完成
            ser.write(b"WHOAMI\n")
            response = ser.readline().decode('utf-8').strip()
            if response == "HL340_ARDUINO":
                ser.close()
                return port.device
            ser.close()
        except Exception as e:
            continue
    return None

device_path = find_arduino_by_cmd()
if device_path:
    print(f"找到目标设备:{device_path}")
else:
    print("未找到响应匹配的设备")

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:31:07