Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中访问COM10或更大的端口#_C#_Serial Port - Fatal编程技术网

C# 在C中访问COM10或更大的端口#

C# 在C中访问COM10或更大的端口#,c#,serial-port,C#,Serial Port,我正在使用C#(.NET3.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()) { Con

我正在使用C#(.NET3.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);
}
static void Main(字符串[]args)
{
String Portname=String.Empty;
/*列出计算机上存在的所有COM端口*/
foreach(SerialPort.GetPortNames()中的字符串端口)
{
控制台写入线(端口);
/*如果存在COM10,请复制名称以供进一步使用*/
如果(端口==“COM10”)
{
Portname=ports;//我也尝试过:“\\.\\COM10”;
}
}
/*如果未找到COM10,则返回*/
if(Portname==String.Empty)
{
控制台。写入线(“退出”);
返回;
}
SerialPort端口=新的SerialPort(端口名,
9600,//波特率
奇偶校验。无,//奇偶校验
8、//数据位
停止位。一);//停止位
Port.Open();
对于(int count=0;count<5;count++)
{
端口写入线(“\nHello”);
}
Port.Close();
虽然(正确);
}
每当我在
SerialPort=newserialport(Portname,9600,…)中将
Portname
用作“COM10”时,它给出一个错误,如下所示

端口“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不允许在端口名中使用\\.\符号。我不知道他们为什么这么做。使用\\.\符号,可以打开大于10的端口。因此,唯一的方法是实现您自己的SerialPort组件。

  • 对于小于或等于9的端口:
    新串行端口(“COM9”)
  • 对于大于9的端口:
    newserialport(“\\\.\\COM10”)

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

的可能性很小,但声称可以通过在Windows API中使用CreateFile来实现。(无可否认,这篇文章有点旧)。对不起,没有看到您已经在使用它。我刚看到端口==“COM10”,我以为你已经通过了。在这种情况下,也许你可以试试@Robert Harvey的方法,你逃离com端口的方法不是正确的unc路径。试试@“\\.\COM10”看看你是否能让它运行。注意,你正在尝试“\.\”,但它应该是“\.\”(最后是“\\.\”和转义)。但无论如何,这对于
CreateFile
来说是必要的。我以为.NET不需要这个把戏。@ivo s&@mtrw这两个把戏都不管用。。。。它弹出错误“端口名不能以“\”开头”您使用的是什么.NET framework版本和什么操作系统?我得到的端口名不能以“\”开头。这是操作系统API的解决方案,但它不适用于名为
System.IO.Ports.SerialPort
的.NET类。