C#中无法访问编号大于99的COM端口问题求助
问题解决:System.IO.Ports无法连接COM100及以上端口
问题根源
.NET的System.IO.Ports.SerialPort底层依赖Win32 API,当COM端口号超过9时,直接使用COMxxx格式会触发API解析错误(例如COM100会被错误识别,导致找不到对应端口)。必须使用Windows设备路径格式\\.\COMxxx才能正确识别两位数及以上的COM端口。
修复方案
修改Connect方法中设置PortName的逻辑,自动为端口号大于9的COM端口添加\\.\前缀:
public bool Connect(string comPort) { bool success; // 处理COM端口号,为超过9的端口添加\\.\前缀 string formattedPortName = comPort; if (comPort.StartsWith("COM", StringComparison.OrdinalIgnoreCase)) { if (int.TryParse(comPort.Substring(3), out int portNumber) && portNumber > 9) { formattedPortName = $"\\\\.\\{comPort}"; } } // Baud rate 57600, 8, N, 1 is standard { // Allow the user to set the appropriate properties. _serialPort.PortName = formattedPortName; _serialPort.BaudRate = 57600; _serialPort.Parity = Parity.None; _serialPort.DataBits = 8; _serialPort.StopBits = StopBits.One; _serialPort.Handshake = Handshake.None; _serialPort.Encoding = Encoding.GetEncoding(0); _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; } try { _serialPort.Open(); success = true; _continue = true; } catch (Exception ex) { Console.WriteLine("An exception was thrown:\n{0}", ex.ToString()); Console.WriteLine("Press enter to continue."); Console.ReadLine(); success = false; } return success; }
额外优化提示
- 前缀兼容性:
\\.\前缀对COM1-COM9端口同样有效,不会产生任何问题,无需单独区分处理。 - 端口排序修正:原代码中
serialPortNumbers.Max()是基于字符串排序,会导致COM99排在COM100之前。若要按端口数字大小获取最大端口,可修改为:
string lastPort = serialPortNumbers .Select(port => new { Port = port, Number = int.Parse(port.Substring(3)) }) .OrderByDescending(x => x.Number) .First().Port;
内容的提问来源于stack exchange,提问作者Zoot
相关产品推荐
相关产品推荐

