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.
InformationsquelleAutor Ed. | 2009-06-04
Schreibe einen Kommentar