Как установить состояние DTR/РТС, которое будет использоваться, когда CreateFile () откроет COM-порт

Я писал/поддерживал эмулятор терминала, названный uCon (http://www.umonfw.com/ucon). Все на основе "хорошего-ole" Win32, и находится полностью в 'C'. Меня недавно попросили поддерживать способность иметь присоединение uCon к COM-порту и настроить DTR/РТС в целях за пределами управления потоком RS232. Я знаю, что могу сделать это после того, как CreateFile () называют с помощью EscapeCommFunction () и/или SetCommState (); однако, эти функции могут только быть вызваны ПОСЛЕ ТОГО, КАК CreateFile () возвращает дескриптор открытому порту. К сожалению, когда CreateFile () открывает порт, он устанавливает DTR/РТС на их состояние по умолчанию, которое может (или не может), отличайтесь, чем состояние, что я хочу удержать DTR.

Например, предположите, что пользователю подключили плату к последовательному порту ПК, и строка DTR используется для помещения платы в некоторое нестандартное состояние. С неактивным DTR "нормальные" выполнения платы, но иногда активные против DTR используются для перехода аппаратных средств к некоторому другому состоянию.

В большинстве случаев я видел, CreateFile () приносит активный DTR, затем мой вызов для очистки DTR возвращает его неактивному; однако, это - незначительный сбой, которого я должен избежать. Я нашел функциональный набор под названием GetDefaultCommConfig () и SetDefaultCommConfig (), но не смог заставить их работать успешно. Так, мой вопрос - это...

Существует ли способ предопределить состояние по умолчанию, которое будет установлено на строках управления RS232, когда CreateFile () назовут? Кто-либо использовал GetDefaultCommConfig ()/SetDefaultCommConfig () успешно?

Мне кажется, что это должно позволить мне предварительно устанавливать значение DTR, который будет использоваться, когда CreateFile () называют...

 
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);
    }
}

Но, поскольку Вы, возможно, уже предположили, это не делает. Какие-либо идеи?

5
задан dario_ramos 25 January 2012 в 12:28
поделиться