SerialPort port.open“端口'COM2'不存在。”

时间:2010-07-06 13:06:06

标签: c# .net

我遇到了SerialPort.Open();

的大问题

我正在与usb虚拟com端口(cdc)通信,它被列为COM2。

在TeraTerm / hyperTerminal等中工作正常。但是当我尝试在C#中打开端口时,它会给我一个例外The port 'COM2' does not exist

我使用SerialPort.GetPortNames()函数获取端口名称,调试时它看起来很好。

我试图将名称设置为硬编码,但没有运气。

现在真的很奇怪,它在某些PC上工作正常,而在其他PC上则失败了。在某些PC上它会一直失败,而在其他PC上它会失败10%的时间。

更奇怪的是它取决于所使用的USB端口,一些端口工作正常,另一些端口失败(在同一台PC上!)。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:6)

之前我曾使用过虚拟串口。通常,它们不能作为“COMX:”访问某些Windows API调用,您必须完全指定它们。这可能就是这种情况。尝试使用串行设备的Windows设备命名空间路径。例如:“\\。\ COM2”

我发现调试有用的另一件事是在给定的串口上打开Hyperterm。

最后一件事:为了在没有所有硬件的系统上调试逻辑,我找到了一个名为com0com的精彩程序。它是一个GPL Sourceforge项目,可在您的系统上创建绑定的虚拟COM端口对。无论写入哪一个都可以从另一个读取,反之亦然。你可以编写一个模拟器并给它一个端口,或者只打开它上面的Hyperterm。然后将另一个给你的程序。无需电缆或其他硬件进行测试。

答案 1 :(得分:3)

如果驱动程序为“COM2”返回意外的“文件类型”,则可能导致此错误。

尝试p /调用GetFileType,我相信你会看到这种模式。它必须是FILE_TYPE_CHARFILE_TYPE_UNKNOWN,否则SerialPort会抛出该异常。

class Program
{
  static void Main(string[] args)
  {
    string portName = @"COM2";
    IntPtr handle = CreateFile(portName, 0, 0, IntPtr.Zero, 3, 0x80, IntPtr.Zero);
    if (handle == (IntPtr)(-1))
    {
      Console.WriteLine("Could not open " + portName + ": " + new Win32Exception().Message);
      Console.ReadKey();
      return;
    }

    FileType type = GetFileType(handle);
    Console.WriteLine("File " + portName + " reports its type as: " + type);

    Console.ReadKey();
  }

  [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
  public static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

  [DllImport("kernel32.dll")]
  static extern FileType GetFileType(IntPtr hFile);

  enum FileType : uint
  {
    UNKNOWN = 0x0000,
    DISK = 0x0001,
    CHAR = 0x0002,
    PIPE = 0x0003,
    REMOTE = 0x8000,
  }
}

另请参阅MSDN论坛上的this thread