在C#中访问COM10或更高端口

我正在使用Visual Studio 2010并使用C#(.NET 3.5)进行编程。

我想从COM10写入/读取数据。

这是简单的代码:

static void Main(string[] args) { String Portname = String.Empty; /* List out all COM ports present on the computer. */ foreach (string ports in SerialPort.GetPortNames()) { Console.WriteLine(ports); /* If COM10 exists, copy the name for further use. */ if (ports == "COM10") { Portname = ports; //I also tried this: "\\.\\COM10"; } } /* If COM10 not found, return */ if (Portname == String.Empty) { Console.WriteLine("Exiting"); return; } SerialPort Port = new SerialPort(Portname, 9600, // Baudrate Parity.None, //Parity 8, //DataBits StopBits.One); //Stop Bits Port.Open(); for (int count = 0; count < 5; count++) { Port.WriteLine("\nHello"); } Port.Close(); while (true); } 

每当我在SerialPort Port = new SerialPort(Portname,9600,.....);使用Portname作为“COM10”时SerialPort Port = new SerialPort(Portname,9600,.....); ,它给出了一个错误

端口’COM10’不存在

Port.Open() ,如果COM10不存在,它甚至不应该到达命令Port.Open()

另一种方法,我尝试将Portname称为“\。\ COM10”。 它给出了一个错误

给定的端口名称不以COM / com开头,也不会解析为有效的串行端口。

任何大于COM9的端口号都会发生这种情况。

有出路吗?

我不认为GetPortNames()或Open()导致你的问题:我的赌注是它与硬件有关。 您是否在其他计算机上尝试过代码?

不幸的是,我对你的场景没有直接的经验,因为两位数的端口一直对我有用……但有一件事我想注意:我及时了解到安全比安全更好抱歉,因此我增加了对try-catch块的使用。 在你的情况下,我会这样做:

  static System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); private static int defaultBaudRate = 9600, defaultDataBits = 8; static System.IO.Ports.SerialPort TryOpeningPort(string portName) { System.IO.Ports.SerialPort port = null; timer.Start(); try { port = new System.IO.Ports.SerialPort(portName, defaultBaudRate, System.IO.Ports.Parity.None, defaultDataBits, System.IO.Ports.StopBits.One); port.Open(); port.Close(); /**/Console.WriteLine(portName + " : OK"); } catch (Exception exceptionInfo) //most common is System.UnauthorizedAccessException { port = null; /**/Console.WriteLine(portName + " -- " + exceptionInfo.GetType().ToString() + " : " + exceptionInfo.Message); } timer.Stop(); //Console.WriteLine("Elapsed time : " + timer.ElapsedMilliseconds + "ms" + System.Environment.NewLine); timer.Reset(); return port; } 

你可以直接调用它,如:

  TryOpeningPort("COM10"); 

或使用您的初步检查方法:

  foreach (string portName in System.IO.Ports.SerialPort.GetPortNames()) if (portName.Equals("Com10", StringComparison.InvariantCultureIgnoreCase)) TryOpeningPort(portName); 

您无法打开大于10的串行端口的原因是因为FCL SerialPort的实现类似于以下示例:

 [MonitoringDescription("PortName")] [Browsable(true)] [DefaultValue("COM1")] public string PortName { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get { return this.portName; } set { if (value == null) throw new ArgumentNullException("PortName"); if (value.Length == 0) throw new ArgumentException(SR.GetString("PortNameEmpty_String"), "PortName"); if (value.StartsWith("\\\\", StringComparison.Ordinal)) throw new ArgumentException(SR.GetString("Arg_SecurityException"), "PortName"); if (this.IsOpen) throw new InvalidOperationException(SR.GetString("Cant_be_set_when_open", new object[1] { (object) "PortName" })); else this.portName = value; } } 

如您所见,标准SerialPort不允许您在端口名称中使用\\。\ notation。 我不知道他们为什么这样做。 使用\\。\表示法,可以打开大于10的端口。 因此,唯一的方法是实现自己的SerialPort组件。

  • 对于小于或等于9的端口: new SerialPort("COM9")
  • 对于大于9的端口: new SerialPort("\\\\.\\COM10")

我测试了对大于9的端口使用属性serialArduino.PortName = ...但是这总是导致错误,所以我使用了构造函数new SerialPort()