Wie DTR/RTS Zustand, der verwendet wird, wenn CreateFile() öffnet den COM-port
Ich schrieb/support einen terminal-emulator namens uCon (http://www.umonfw.com/ucon). Seine ganze basiert auf "good-ole -" Win32-und ist ganz in 'C'. Vor kurzem wurde ich gebeten, zu unterstützen, die Fähigkeit zu haben, uCon befestigen an einem COM-port einrichten und DTR/RTS für Zwecke außerhalb des RS232-Flusskontrolle. Ich weiß, ich kann dies tun, nachdem Sie CreateFile() wird aufgerufen, mit EscapeCommFunction() und/oder SetCommState(); diese Funktionen können jedoch nur aufgerufen werden, NACHDEM CreateFile() gibt einen handle auf den geöffneten port. Leider, wenn CreateFile() öffnet den port, es wird DTR/RTS auf die Standardeinstellung zurück, die möglicherweise (oder auch nicht), anders als der Staat, dass ich wünschte, zu halten DTR in.
Nehmen wir beispielsweise an, der user hat ein Brett an den PC angeschlossenen seriellen port, und die DTR-Leitung wird verwendet, um den Vorstand in einigen nicht-standard-Zustand. Mit DTR inaktiv ist, auf dem board läuft "normal", aber gelegentlich DTR-active wird verwendet, um den übergang der hardware zu einigen anderen Zustand.
In den meisten Fällen, die ich gesehen habe, CreateFile() bringt das DTR aktiv ist, dann ist mein Aufruf klar DTR bringt es zurück zu inaktiv, aber das ist ein glitch, die ich brauche zu vermeiden. Fand ich eine Funktion namens GetDefaultCommConfig() & SetDefaultCommConfig() aber nicht in der Lage, Sie zu erhalten, erfolgreich zu arbeiten. So, meine Frage ist...
Gibt es eine Möglichkeit, pre-definieren Sie die Standard-Staat errichtet wird, der auf der RS232-Steuerleitungen, wenn CreateFile() aufgerufen wird? Hat jemand verwendet GetDefaultCommConfig()/SetDefaultCommConfig() erfolgreich?
Es scheint mir, dass dies sollte mir erlauben, die pre-stellen Sie den Wert des DTR werden
verwendet, wenn CreateFile() wird aufgerufen...
int EstablishDefaultDTR(char *comPortName, int dtr) { COMMCONFIG cc; DWORD bsize = sizeof(COMMCONFIG); wenn (GetDefaultCommConfig(comPortName,&cc&bsize) == 0) { ShowLastError("GetDefaultCommConfig()"); return(-1); } wenn (dtr) cc.dcb.fDtrControl = DTR_CONTROL_ENABLE ; sonst cc.dcb.fDtrControl = DTR_CONTROL_DISABLE ; wenn (SetDefaultCommConfig(comPortName,&cc,bsize) == 0) { ShowLastError("SetDefaultCommConfig()"); return(-1); } }
Aber, wie Sie vielleicht schon erraten haben, gibt es nicht.
Irgendwelche Ideen?
- Hast du auch schon hier: msdn.microsoft.com/en-us/library/ms810467.aspx Der Artikel bietet BuildCommDCB() als alternative ... vielleicht wird der trick für Sie?
- Ich habe genau das gleiche problem. Konnten Sie es lösen? Ich ' m bietet ein Kopfgeld.
- Hast du auch schon hier: codeguru.com/forum/showthread.php?t=291244 Gleiche problem auf der hand. Aber TDM Forderungen, dass das setzen der DTR für den Zustand nach Eröffnung der port ist die einzige definierte Weise, so zu tun. Wenn ein Schalter 100ms Verzögerung tötet die hardware, als es ist ein Designfehler von Anfang an.
- In meinem Fall, es nicht zu töten, es macht einfach ein X-Ray tube spin nutzlos, die vermieden werden sollten, aber nicht tödlich. Ich Stimme mit Ihnen überein, aber egal, das
MODE
Lösung funktioniert perfekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht nicht die Schnellste Methode, aber so funktioniert es:
MODE
- Befehl fehlschlägt. Das nächste mal, wenn Sie den port öffnen, den Sie hält den vorherigen Zustand. Sie können das gleiche Verhalten durch das öffnen eines Ports, Einstellung DTR, schließen Sie den port, und öffnen Sie es erneut im code.CreateFile
gelingt, aber der port wird geöffnet mit der richtigen DTR-Zustand (vor, es fing IMMER mit DTR-set), und die Kommunikation funktioniert, wie erwartet.Bist du nicht die Initialisierung der COMMCONFIG-Struktur. Das könnte gut das problem sein, da die Dokumentation, die explizit sagt, dass Sie festlegen müssen, dwSize mindestens
cc.dwSize = sizeof( COMMCONFIG );
GetDefaultCommConfig
ich überprüftcc
's Inhalt und das einzige seltsame Sache, die ich sah, war, dasscc.dcb.DCBLength
erreicht3435973836
. Ich bin gonna versuchen, mitBuildCommDCB
vor dem ersten Aufruf. Jeder andere Vorschlag ist willkommen.COMMCONFIG
und die Einstellung seiner Größe, die ich verwendetBuildCommDCB
zu setzen DCB. Ich habe versucht zu tun, dass vorGetDefaultCommConfig
. Nach diesem Anruf änderte ich die Struktur, die Inhalte zu deaktivieren DTR, bevor der Anruf zuSetDefaultCommConfig
. Ich habe mit dem debugger und alle die Struktur, die Inhalte sinnvoll, den ganzen Weg, aber immer noch der port immer geöffnet mit DTR gesetzt. Ich habe auch irgendwo gelesen, dass diese Art und Weise zu tun, es funktioniert nicht mit einigen Geräten, so gab ich auf und nahm die Lösung aus meiner Antwort,BuildCommDCB
Sie vielleicht feststellen, dass einige Fehler (abgesehen von der offensichtlichen, ihn aber nicht kompilieren, außerhalb meines test, ich nur setzen Sie es, es zu teilen)