c ++ - Sådan indstilles DTR/RTS-tilstand, der vil blive brugt, når CreateFile () åbner COM-port

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skrev/støtter en terminalemulator kaldet uCon (http://www.umonfw.com/ucon). Det er alt baseret på 'good-ole' Win32, og er helt i 'C'. Jeg blev for nylig blevet bedt om at støtte evnen til at få uCon til at binde til en COM-port og konfigurere DTR/RTS til formål uden for RS232-flowkontrol. Jeg ved, at jeg kan gøre dette efter CreateFile () kaldes ved hjælp af EscapeCommFunction () og/eller SetCommState (); Disse funktioner kan dog kun kaldes AFTER CreateFile () returnerer et håndtag til den åbne port. Desværre, når CreateFile () åbner porten, sætter den DTR/RTS til deres standardstatus, hvilket måske (eller måske ikke) er anderledes end den stat, jeg ønsker at beholde DTR. [3]


Antag for eksempel, at brugeren har et kort, der er forbundet til pc'ens serielle port, og DTR-linjen bruges til at sætte brættet i nogle ikke-standardtilstand. Med DTR inaktiv kører brættet 'normal', men nogle gange DTR- aktiv bruges til at overføre hardware til en anden stat.


I de fleste tilfælde har jeg set, CreateFile () bringer DTR aktiv, så min opfordring til at rydde DTR bringer den tilbage til inaktiv, men det er en fejl, jeg skal undgå. Jeg fandt et funktionssæt kaldet GetDefaultCommConfig () & SetDefaultCommConfig () men har ikke kunnet få dem til at fungere korrekt. Så mit spørgsmål er dette ...


Er der en måde at forud definere standardtilstanden, der vil blive etableret på RS232-styrelinierne, når CreateFile () kaldes? Har nogen brugt GetDefaultCommConfig ()/SetDefaultCommConfig () med succes?


Det forekommer mig, at dette skal give mig mulighed for at forudse værdien af ​​DTR til at være
bruges når CreateFile () kaldes ...


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

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

    if (dtr)
       cc.dcb.fDtrControl = DTR\_CONTROL\_ENABLE ;
    else
       cc.dcb.fDtrControl = DTR\_CONTROL\_DISABLE ;

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


Men som du måske allerede har gættet, gør det ikke.
Nogle ideer?

Bedste reference


Må ikke være den hurtigste måde, men det virker:


#include <stdlib.h>
#include <stdio.h>

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

Andre referencer 1


Du 'initialiserer ikke COMMCONFIG-strukturen. Det kan godt være problemet, da dokumentationen udtrykkeligt siger, at du skal indstille dwSize mindst


cc.dwSize=sizeof (COMMCONFIG);