Я писал/поддерживал эмулятор терминала, названный 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); } }
Но, поскольку Вы, возможно, уже предположили, это не делает. Какие-либо идеи?