I found several ways to do this. The following two documents were the starting point.
The key is in the next paragraph from the first document
The easiest way to determine which baud rates are available for a particular serial port is to call the GetCommProperties () API (API) and examine the COMMPROP.dwSettableBaud bitmask to determine which baud rates are supported on that serial port.
At this point in C # there are two options:
1.0 Use interop (P / Invoke) as follows:
Define the following data structure
[StructLayout(LayoutKind.Sequential)] struct COMMPROP { short wPacketLength; short wPacketVersion; int dwServiceMask; int dwReserved1; int dwMaxTxQueue; int dwMaxRxQueue; int dwMaxBaud; int dwProvSubType; int dwProvCapabilities; int dwSettableParams; int dwSettableBaud; short wSettableData; short wSettableStopParity; int dwCurrentTxQueue; int dwCurrentRxQueue; int dwProvSpec1; int dwProvSpec2; string wcProvChar; }
Then define the following signatures
[DllImport("kernel32.dll")] static extern bool GetCommProperties(IntPtr hFile, ref COMMPROP lpCommProp); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
Now make the following calls (see http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx )
COMMPROP _commProp = new COMMPROP(); IntPtr hFile = CreateFile(@"\\.\" + portName, 0, 0, IntPtr.Zero, 3, 0x80, IntPtr.Zero); GetCommProperties(hFile, ref commProp);
Where is portName something like COM ?? (COM1, COM2, etc.). commProp.dwSettableBaud should now contain the necessary information.
2.0 Use reflection C #
Reflection can be used to access the SerialPort base stream, and then the required data as follows:
_port = new SerialPort(portName); _port.Open(); object p = _port.BaseStream.GetType().GetField("commProp", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_port.BaseStream); Int32 bv = (Int32)p.GetType().GetField("dwSettableBaud", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(p);
Please note that in both of the above methods, the port must be opened at least once in order to receive this data.