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

Swa*_*and 5 c# serial-port

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

每当我在中使用Portname“ COM10”时SerialPort Port = new SerialPort(Portname,9600,.....);,都会显示错误消息

端口“ COM10”不存在

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

另一种方式,我尝试将端口名设置为“ \。\ COM10”。它给出了一个错误

给定的端口名不能以COM / com开头或不能解析为有效的串行端口。

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

有出路吗?

C.B*_*.B. -1

我认为 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;
    }
Run Code Online (Sandbox Code Playgroud)

您可以直接调用它,如下所示:

        TryOpeningPort("COM10");
Run Code Online (Sandbox Code Playgroud)

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

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