无法在 .NET 中打开串行端口

Posted

技术标签:

【中文标题】无法在 .NET 中打开串行端口【英文标题】:Unable to open serial port in .NET 【发布时间】:2009-11-18 21:42:47 【问题描述】:

我正在尝试打开 COM1,但每次调用 SerialPort.Open() 时都会收到一个奇怪的错误。

错误是:

给定的端口名称不以 COM/com 开头或不解析为有效的串行端口。 参数名称:portName

代码很简单:

SerialPort port = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.RequestToSend;
port.Open();

如果我调用SerialPort.GetPortNames(),它会返回一个名为“COM1”的端口。

我已确认我的计算机上有一个“COM1”,并且我没有在任何其他应用程序中使用它。当我在另一台计算机上运行代码时,它可以工作。我的系统运行的是 Windows Vista。 .NET 的版本是 2.0。

是否有我必须在某处更改的安全设置?我以管理员身份登录,并关闭了 UAC。


更多信息

我使用 Process Explorer 并确认没有使用 \Device\Serial0。


解决方法

我安装了一个 USB 串行适配器 (COM3),它工作正常。去搞清楚。 COM1 肯定有问题。

【问题讨论】:

我知道 GetPortNames() 有时会给出不可靠的字符。 超级终端能用吗? 【参考方案1】:

我也有这个问题。原来,我有一台打印机设置为使用我试图打开的 COM 端口。一旦我将打印机更改为使用另一个端口,该端口就可以正常打开。

【讨论】:

谢谢 - 我花了 2 个小时试图弄清楚这一点! 你是怎么改的? @JohnDemetriou,更改打印机端口可能因您使用的 Windows 版本而异。我建议只是“谷歌搜索”你的 Windows 版本的答案。【参考方案2】:

尝试使用符号 \.\COMX 而不仅仅是 COMX。 确保您转义字符: "\\.\COM1"

编辑:Wops,所以转义了我的 \ 所以它应该是这样的(省略空格): "\ \ \ \ . \ \ COM1"

【讨论】:

如果我这样做,我会得到一个异常,指出 COM 端口不能以 \【参考方案3】:

您可以尝试设置端口的属性,而不是使用构造函数。

mPort = new System.IO.Ports.SerialPort();
if(mPort.IsOpen)

   mPort.Close();

mPort.PortName = "COM1";
mPort.BaudRate = 19200;
mPort.Parity = Parity.None;
mPort.DataBits = 8;
mPort.StopBits = StopBits.One;
mPort.Handshake = Handshake.RequestToSend; // Handshake.None;
mPort.Open();

我也遇到了串行通信和 Microsoft Active Sync 的问题。我不确定你是否有这个运行,但它可能值得一试杀死它(任务管理器中的进程名称是 wcescomm.exe)。希望对您有所帮助。

您也可以尝试使用 Marshal.GetLastWin32Error() 来查看低级别是否导致问题?我不确定这是否会为您提供更多信息。

【讨论】:

您可以(在这种情况下)省略对 .PortName 的调用,因为它在内部默认设置为“COM1”。 还有 DataBits 和 StopBits。【参考方案4】:

可能是某些在后台运行的应用程序可能打开了您的端口(请参阅question)。

下载Process Explorer并使用“查找”菜单上的“查找句柄或DLL”来查找打开com端口的进程。就我而言,spoolsv.exe 始终使用 COM1、COM3 端口。所以我使用了另一个 com 端口 (COM2) 祝你好运!

【讨论】:

以上是关于无法在 .NET 中打开串行端口的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中,我如何监听已经打开的 COM(串行)端口?

为啥我不能从 Android 上的串行端口打开/写入?

如何在 iOS 5.0.1 中打开 Dock 连接器的串行端口

尝试在 WinXP 上使用 pyserial 打开串行端口 - >“拒绝访问”

如果未使用 CloseHandle 正确关闭,则重新打开串行端口失败

使用 node.js 访问虚拟串行端口会给出错误或没有打开事件