无法在 .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 中打开串行端口的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 5.0.1 中打开 Dock 连接器的串行端口
尝试在 WinXP 上使用 pyserial 打开串行端口 - >“拒绝访问”