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

如何为ESP32串口(COM口)设置自定义名称并在Unity C#中识别该名称

为ESP32蓝牙串口设置自定义名称并在Unity C#中识别的方法

要解决这个问题,我们需要分两步走:首先在ESP32端配置蓝牙串口的自定义设备名称,然后在Unity中通过WMI(Windows Management Instrumentation)API读取每个COM口对应的设备友好名称——因为SerialPort.GetPortNames()只能返回端口编号,没法直接获取自定义名称。


第一步:在ESP32端设置蓝牙串口的自定义名称

假设你用的是Arduino框架开发ESP32,我们可以利用ESP32自带的经典蓝牙SPP(串口协议)功能,直接在代码中设置蓝牙设备的自定义名称。这样当ESP32连接到电脑时,系统会识别到这个名称并关联到虚拟COM口。

示例代码:

#include "BluetoothSerial.h"

// 声明蓝牙串口对象
BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  
  // 这里的"MyESP32_Serial"就是你想要的自定义名称
  if (!SerialBT.begin("MyESP32_Serial")) {
    Serial.println("蓝牙初始化失败");
  } else {
    Serial.println("蓝牙串口已启动,名称:MyESP32_Serial");
  }
}

void loop() {
  // 转发串口数据(可选,根据你的需求调整)
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

上传这段代码到ESP32后,当你通过蓝牙连接ESP32到电脑,系统生成的虚拟COM口的友好名称会包含你设置的"MyESP32_Serial"(比如显示为MyESP32_Serial (COM9))。


第二步:在Unity C#中读取COM口的自定义名称

SerialPort.GetPortNames()只能拿到端口编号,要获取对应的设备友好名称,我们需要借助WMI API来查询系统的硬件设备信息。注意以下几点:

  1. 确保Unity的.NET兼容级别设置为**.NET Framework**(路径:Edit > Project Settings > Player > Other Settings > Configuration),因为WMI属于.NET Framework的API。
  2. 这个方法仅适用于Windows系统(因为COM口是Windows的概念)。

示例代码:

using System;
using System.Management;
using System.IO.Ports;
using UnityEngine;

public class SerialPortDetector : MonoBehaviour
{
    public void ScanPortsWithCustomNames()
    {
        // 先获取所有可用的COM端口编号
        string[] portNumbers = SerialPort.GetPortNames();
        
        foreach (string port in portNumbers)
        {
            string customName = GetPortFriendlyName(port);
            Debug.Log($"端口:{port},自定义名称:{customName}");
        }
    }

    // 从系统中读取指定COM口的友好名称
    private string GetPortFriendlyName(string portName)
    {
        try
        {
            // 查询系统中所有带COM口的即插即用设备
            using (var searcher = new ManagementObjectSearcher(
                "root\\CIMV2", "SELECT * FROM Win32_PnPEntity WHERE Caption LIKE '%(COM%'"))
            {
                foreach (ManagementObject device in searcher.Get())
                {
                    string caption = device["Caption"].ToString();
                    if (caption.Contains(portName))
                    {
                        // 提取括号外的自定义名称部分
                        int bracketIndex = caption.IndexOf($"({portName})");
                        if (bracketIndex != -1)
                        {
                            return caption.Substring(0, bracketIndex).Trim();
                        }
                        return caption;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.LogError($"读取端口名称出错:{ex.Message}");
        }
        
        return "未知设备";
    }
}

调用ScanPortsWithCustomNames()方法后,你就能在Unity的Console中看到每个COM口对应的自定义名称了——比如COM9对应的MyESP32_Serial。


额外说明

  • 如果手动修改过设备管理器中COM口的友好名称,代码也能读取到这个修改后的名称,但这种方式是本地设置,换电脑会失效,建议优先通过ESP32代码设置蓝牙名称。
  • 如果你用的是ESP32的BLE蓝牙,设置设备名称的方式会略有不同,但BLE通常不会直接映射为虚拟COM口,需要额外的串口转发工具,所以经典蓝牙SPP是更适合的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:22:36