C# 在C中访问COM10或更大的端口#
我正在使用C#(.NET3.5)进行编程 我想从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
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类。