Ich habe ein paar Wege gefunden, dies zu tun. Die folgenden beiden Dokumente waren ein Ausgangspunkt
Der Schlüssel ist im folgenden Abschnitt aus dem ersten Dokument
Die einfachste Art und Weise, welche Baudraten zu bestimmen Sind an einer bestimmten seriellen Schnittstelle verfügbar, rufen Sie die GetCommProperties() - Anwendungsprogrammierschnittstelle (API) auf und untersuchen Sie die COMMPROP.dwSettableBau d Bitmaske, um zu bestimmen, welche Baudraten an diesem seriellen Port unterstützt werden.
In diesem Stadium gibt es zwei Möglichkeiten, diese in C# zu tun:
1,0 Verwenden interop (P/Invoke) wie folgt:
definieren folgende Datenstruktur
[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;
}
Dann definieren Sie die folgenden Signaturen
[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);
Jetzt machen die folgenden Anrufe (siehe 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);
Wo portname ist so etwas wie COM ?? (COM1, COM2 usw.). commProp.dwSettableBaud sollte jetzt die gewünschten Informationen enthalten.
2.0 Verwenden C# Reflexion
Reflexion verwendet werden, können die Serialport Base zuzugreifen und von dort die erforderlichen Daten wie folgt:
_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);
anzumerken, dass sowohl bei den Verfahren über dem Port (s) muss mindestens einmal geöffnet werden, um diese Daten zu erhalten.
Ich denke, Sie müssen den Griff schließen, wenn Sie fertig sind, indem Sie CloseHandle (hFile) aufrufen –
@ HiteshP: An jeden, der Windows CE verwendet, nehmen Sie die folgenden zwei Änderungen: (1) ändern "Zeichenfolge wcProvChar" auf "Char wcProvChar "in der COMMPROP-Struktur und (2)" coredll.dll "statt" kernel32.dll "für beide P/Invokes verwenden. Beachten Sie, dass Sie das Dateihandle anschließend auch an den COM-Port anschließen sollten, wie Jakub darauf hinweist. – AlainD