ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
20 мая
299137 Топик полностью
Ксения (13.01.2012 18:53 - 20:23, просмотров: 200) ответил leon_ на Как можно поменять состояние 7-го вывода СОМ-порта под WinXP, если он занят программой (Необходимо для спекулятивного питания адаптера)?
Что угодно можно делать через структуру DCB. А данную установку делают через ее элемент fRtsControl так: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363214(v=vs.85).aspx
DCB comDCB; //cоздаем нашу структуру DCB HANDLE COMhandle = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL); //открываем COM-порт, как файл GetCommState(COMhandle, &comDCB); //читаем текущие установки COM-порта в нашу структуру DCB comDCB.fRtsControl = RTS_CONTROL_ENABLE; // изменяем значение элемента fRtsControl в структуре DCB на требуемое значение (там 4 возможности - см. ссылку) BuildCommDCB(COMname, &comDCB); //загоняем структуру DCB обратно в COM-порт Аналогично можно ковырять все остальные параметры порта, изменяя соответствующие им элементы структуры DCB. Однако настоятельно рекомендую делать это на месте предварительно прочитанной DCB, взятой из порта, поскольку правильно ее заполнить с начала до конца вам ума не хватит :). Желательно проверить, что возвращает BuildCommDCB(), правду или ложь. А то может и отказаться, если DCB-структура неправильно заполнена. Лично я предпочитаю устанавливать: comDCB.fRtsControl = RTS_CONTROL_TOGGLE; Аналогично устанавливаю и DTR: comDCB.fDtrControl = DTR_CONTROL_HANDSHAKE; Тогда сигналы на линиях RTS и DTR устанавливаются сами на тот промежуток времени, пока идет передача (т.е. в буфере что-то есть) или прием. А саму передачу или прием осуществляю банальным образом - как запись или чтение из файла, открытого, как COM-порт (т.е. пишу по хендлу COMhandle командами ReadFile и WriteFile). Для питания внешнего устройства, когда линии RTS и DTR используются не по прямому назначению, а только для получения питания, делаю такие установки: comDCB.fDtrControl = DTR_CONTROL_DISABLE; comDCB.fRtsControl = RTS_CONTROL_ENABLE; comDCB.fOutxCtsFlow = false; comDCB.fOutxDsrFlow = false; При этом получается приличное напряжение между линиями RTS и DTR, поскольку на них разная полярность.