Comment définir l’état DTR / RTS qui sera utilisé lorsque CreateFile () ouvre le port COM

J’ai écrit / supporté un émulateur de terminal appelé uCon ( http://www.umonfw.com/ucon ). Son tout est basé sur “Good-Ole” Win32, et est entièrement en “C”. On m’a récemment demandé de prendre en charge la possibilité de connecter uCon à un port COM et de configurer DTR / RTS à des fins autres que le contrôle de stream RS232. Je sais que je peux le faire après que CreateFile () est appelé en utilisant EscapeCommFunction () et / ou SetCommState (); Toutefois, ces fonctions ne peuvent être appelées que APRÈS CreateFile () renvoie un descripteur au port ouvert. Malheureusement, lorsque CreateFile () ouvre le port, il définit DTR / RTS sur son état par défaut, qui peut (ou non) être différent de celui dans lequel je souhaite conserver DTR.

Par exemple, supposons que l’utilisateur ait une carte connectée au port série du PC et que la ligne DTR soit utilisée pour mettre la carte dans un état non standard. Avec DTR inactif, la carte fonctionne “normalement”, mais DTR-active est parfois utilisé pour transférer le matériel vers un autre état.

Dans la plupart des cas, CreateFile () active le DTR, puis mon appel pour effacer le DTR le rend inactif; Cependant, c’est un problème que je dois éviter. J’ai trouvé un jeu de fonctions appelé GetDefaultCommConfig () & SetDefaultCommConfig () mais je n’ai pas réussi à les faire fonctionner correctement. Voici donc ma question…

Est-il possible de prédéfinir l’état par défaut qui sera établi sur les lignes de contrôle RS232 lorsque CreateFile () est appelé? Quelqu’un at-il utilisé GetDefaultCommConfig () / SetDefaultCommConfig () avec succès?

Il me semble que cela devrait me permettre de préétablir la valeur de DTR à utiliser lorsque CreateFile () s’appelle …

 
 int
 EstablishDefaultDTR (char * comPortName, int dtr)
 {
     COMMCONFIG cc;
     DWORD bsize = sizeof (COMMCONFIG);

     if (GetDefaultCommConfig (comPortName, & cc, & bsize) == 0) {
         ShowLastError ("GetDefaultCommConfig ()");
         retourner (-1);
     }

     si (dtr)
        cc.dcb.fDtrControl = DTR_CONTROL_ENABLE;
     autre
        cc.dcb.fDtrControl = DTR_CONTROL_DISABLE;

     if (SetDefaultCommConfig (comPortName, & cc, bsize) == 0) {
         ShowLastError ("SetDefaultCommConfig ()");
         retourner (-1);
     }
 }

Mais, comme vous l’avez peut-être déjà deviné, ce n’est pas le cas. Des idées?

Peut-être pas le moyen le plus rapide, mais cela fonctionne:

 #include  #include  int EstablishDefaultDTR(char *comPortName, int dtr){ char commandSsortingng[256]; if ( !system(NULL) ){ ShowLastError("system()"); return(-1); } sprintf( commandSsortingng, "MODE %s dtr=%s%", comPortName, dtr? "on":"off" ); return system( commandSsortingng ); } 

Vous n’initialisez pas la structure COMMCONFIG. Cela pourrait bien être le problème car la documentation dit explicitement que vous devez définir dwSize au moins

cc.dwSize = sizeof (COMMCONFIG);