Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SerialPort port.open "The port 'COM2' does not exist."

Tags:

c#

.net

I'm having a big problem with the SerialPort.Open();

I am communicating with an usb virtual com port (cdc), and it is listed as COM2.

It works fine in TeraTerm/hyperTerminal ect. but when I try to open the port in C#, it gives me the Exception The port 'COM2' does not exist.

I get the port name using the SerialPort.GetPortNames() function, and it looks fine when I debug.

I have tried to set the name hardcoded, but with no luck.

Now the really strange thing, it works fine on some PC's, and fails on other PC's. On some PC's it fail all the time, and on others it fails 10% of the time.

Even more strange it depends on the usb port used, some ports works fine, others fail (on the same PC!).

Could anybody help me please?

like image 848
JakobJ Avatar asked Jul 06 '10 13:07

JakobJ


2 Answers

I've worked with virtual serial ports before. Oftentimes they aren't accessible as "COMX:" to some windows API calls, and you have to fully specify them. That might be the case here. Try using the Windows device namespace path for the serial device. For example: "\\.\COM2"

Another thing I've found useful for debugging is opening up a Hyperterm on the given serial port.

One final thing: For debugging your logic on systems that don't have all the hardware, I found this wonderful program called com0com. It is a GPL Sourceforge project that creates tied pairs of virtual com ports on your system. Whatever is written to one can be read from the other, and visa versa. You can either write an emulator and give it one of the ports, or just open up Hyperterm on it. Then give the other to your program. Testing with no cables or other hardware required.

like image 160
T.E.D. Avatar answered Sep 21 '22 23:09

T.E.D.


This error can be caused if the driver returns an unexpected "file type" for "COM2".

Try p/Invoking GetFileType and I believe you'll see the pattern. It has to be FILE_TYPE_CHAR or FILE_TYPE_UNKNOWN or else SerialPort will throw that exception.

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,
  }
}

Also see this thread on MSDN forums.

like image 33
Stephen Cleary Avatar answered Sep 22 '22 23:09

Stephen Cleary