Ответ 1
Я нашел несколько способов сделать это. Следующие два документа были отправной точкой
- http://support.microsoft.com/default.aspx/kb/99026
- http://msdn.microsoft.com/en-us/library/aa363189(VS.85).aspx
Ключ находится в следующем абзаце из первого документа
Самый простой способ определить, какие скорости передачи данных доступны для определенного последовательного порта, - это вызвать интерфейс прикладного программирования GetCommProperties() (API) и изучить битмаску COMMPROP.dwSettableBaud, чтобы определить, какие скорости передачи поддерживаются на этом последовательном порту.
На этом этапе в С# есть два варианта:
1.0 Используйте interop (P/Invoke) следующим образом:
Определите следующую структуру данных
[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;
}
Затем определите следующие подписи
[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);
Теперь выполните следующие вызовы (см. 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);
Где portName - это что-то вроде COM?? (COM1, COM2 и т.д.). commProp.dwSettableBaud теперь должен содержать нужную информацию.
2.0 Используйте отражение С#
Отражение можно использовать для доступа к базовому потоку SerialPort, а затем требуемые данные следующим образом:
_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);
Обратите внимание, что в обоих вышеописанных методах порт должен быть открыт хотя бы один раз, чтобы получить эти данные.