如何为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来查询系统的硬件设备信息。注意以下几点:
- 确保Unity的.NET兼容级别设置为**.NET Framework**(路径:
Edit > Project Settings > Player > Other Settings > Configuration),因为WMI属于.NET Framework的API。 - 这个方法仅适用于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
相关产品推荐
相关产品推荐

