2009-11-18 89 views
8

我正在尝试打开COM1,但每次拨打SerialPort.Open()时都会发生奇怪的错误。无法在.NET中打开串口

的错误是:

给定的端口名称不会与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中并确认没有使用\设备\ Serial0上。


解决方法

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

+0

我知道有时'GetPortNames()'会给它带来不可思议的字符。 – 2009-11-18 21:45:23

+0

超级终端工作? – SwDevMan81 2009-11-19 18:25:40

回答

-1

也许是一个错字?确保您使用所有英文字母输入COM1。

+5

我100%确定“COM1”拼写正确。 – 2009-11-19 12:13:47

1

尝试使用符号\。\ COMX而不是COMX。 确保你逃脱字符: “\\。\ COM1”

编辑:佬,SO逃脱我的\所以它应该是这样的(ommit空格): “\ \ \ \ \ \ COM1”

+1

如果我这样做,我得到一个异常,说明COM端口不能以\ – 2009-11-19 14:11:32

1

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

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()来查看低级别是否导致问题?我不确定这是否会给你更多的信息。

+0

开始您可以(在这种情况下)省略对.PortName的调用,因为默认情况下它在内部设置为“COM1”。 – Andy 2009-11-19 19:01:23

+0

还有DataBits和StopBits。 – SwDevMan81 2009-11-19 19:18:48

5

我也有这个问题。事实证明,我有一台打印机设置为使用我试图打开的COM端口。一旦我改变打印机使用另一个端口的端口打开就好了。

+0

谢谢 - 我花了2个小时试图弄清楚这一点! – 2013-04-02 02:27:58

1

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

下载Process Explorer并使用“查找”菜单上的“查找句柄或DLL”查找COM端口打开的进程。在我的情况下,spoolsv.exe总是使用COM1,COM3端口。所以我用另一个COM端口(COM2)祝你好运!