|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[3] BuildCommDCB("baud=9600 parity=N data=8 stop=1",dcb); dcb->fNull=TRUE; ct.ReadIntervalTimeout=10; ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0; ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0; port=CreateFile("COM2",GENERIC READGENERIC WRITE,0,NULL,OPEN EXISTING,0,NULL SetCommState(port,dcb); SetCommTimeouts(port,&ct); HeapFree(GetProcessHeap(),0,dcb); CloseHandle(port); В этом примере полностью убрана обработка ошибок. Обрабатывать ошибки необходимо, но сейчас главное разобраться в работе с портом, а обработка ошибок уменьшает наглядность. Первым делом, с помощью функции HeapAlloc, выделяется и заполняется нулями область памяти для DCB. Затем в поле DCBlength заносится размер структуры DCB в байтах. Зачем это нужно обсуждалось выше, при описании данного поля. Для общего (и наглядного) заполнения DCB использована функция BuildCommDCB. Будем считать, что нас устраивает информация занесеная в DCB, но требуется игнорировать нулевые байты при приеме. Так как BuildCommDCB не выполняет требуемых действий мы вручную изменяем соответсвующее поле. Далее мы заполняем информацию о тайм-аутах. Общие тайм-ауты операций чтения и записи не используются, конец сообщения определяется по тайм-ауту между двумя последовательными символами большему 10 миллисекунд. Теперь можно открыть порт, что делается функцией CreateFile, и выполнить его настройку вызвав функции SetCommState и SetCommTimeots. После установки параметров порта структура DCB становится не нужной, поэтому можно освободить занимаемую ей память. Структура COMMTIMEOUTS в примере размещена статически, поэтому выделять под нее память и освобждать ее не требуется. Наконец, мы закрываем порт перед завершением. Функции HeapAlloc и HeapFree занимаются выделением и освобождением памяти из куч, которых в программе может быть несколько. Вместо этих функций можно использовать malloc (calloc) и free. Однако использование функций предоставляемых Win32 API позволяет сократить размер программы, что может быть не маловажно, если работа с портами ведется из DLL (например Вы пишете своеобразный псевдодрайвер для своего устройства). Есть и другие аргументы в пользу этой точки зрения, которую я Вам, впрочем, не навязываю. Рассмотренные структуры и функции позволяют программировать порт на достаточно низком уровне. Их, в большинстве случаев, более чем достаточно даже для тонкой настройки порта. Однако бывают и исключения. Например, под именем COM1 может скрываться вовсе не привычный порт RS-232, а какая-нибудь экзотика. Или порт может не позволять задавать скорость более 9600. Структура COMMPROP Исчерпывающая информация о возможностях коммуникационного устройства и драйвера содержится в структуре COMMPROP: typedef struct COMMPROP {{
Поля этой структуры описывают все возможности драйвера. Вы не можете выйти за пределы этих возможностей. Вот какое значение имеют поля: wPacketLength Задает размер, в байтах, структуры COMMPROP. wPacketVersion Номер версии структуры. dwServiceMask Битовая маска. Для коммуникационных устройств всегда SPSERIALCOMM, включая модемы. dwReservedl Зарезервировано и не используется. dwMaxTxQueue Максимальный размер, в байтах, внутреннего буфера передачи драйвера. Нулевое значение свидетельствует об отсутствии ограничения. dwMaxRxQueue Максимальный размер, в байтах, внутреннего буфера приема драйвера. Нулевое значение свидетельствует об отсутствии ограничения. dwMaxBaud Максимально допустимая скорость обмена, в битах в секунду (бпс). Возможны следующие значения данного поля:
dwProvCapabilities Битовая маска. Определяет возможности •PCF 16BITMODE •PCF DTRDSR •PCF INTTIMEOUTS •PCF PARITY CHECK •PCF RLSD PCF RTSCTS PCF SETXCHAR PCF SPECIALCHARS PCF TOTALTIMEOUTS PCF XONXOFF PCF XONXOFF предоставляемые устройством. Возможны следующие значения: Поддерживается специальный 16-битный режим. Поддерживаются сигналы DTR/DSR. Поддерживается межсимвольный тайм-аут. Поддерживается контроль четности. Поддерживается определение наличия сигнала в приемной линии. Поддерживаются сигналы RTS/CTS. Поддерживаются задаваемые символы XON/XOFF. Поддерживаются спецсимволы. Поддерживаются общие тайм-ауты (ожидаемое время). Поддерживается программное (XON/XOFF) управление потоком. Поддерживается программное (XON/XOFF) управление потоком. dwSettableParams Битовая маска. Определяет допустимые для изменения параметры. Возможны следующие значения: •SP BAUDСкорость обмена. •SP DATABITSБит в символе. •SP HANDSHAKINGРукопожатие (управление потоком). •SPPARITYЧетность. •SP PARITY CHECKКонтроль четности. •SP RLSDДетектирование наличия сигнала в приемной линии. •SP STOPBITSКоличество стоповых бит. dwSettableBaud Битовая маска. Определяет допустимый набор скоростей обмена. Допустимые для данного поля значения указаны в описании поля dwMaxBaud. wSettableData •Битовая маска. Определяет допустимые длины символов, в битах. Возможны следующие значения: DATABITS 5 DATABITS 6 DATABITS 7 DATABITS 8 DATABITS 16 Специальный широкий канал через аппаратную последовательную линию. wSettableStopParity Битовая маска. Определяет допустимое количество стоповых бит и режимы четности. Возможны следующие значения: •STOPBITS10Один стоповый бит •STOPBITS15Полтора стоповыx бита •STOPBITS 20Два стоповых бита •PARITY NONEБез четности •PARITY ODDДоплнение до нечетности •PARITY EVENДополнение до четности •PARITY MARKБит четности всегда "1" •PARITY SPACEБит четности всегда "0" dwCurrentTxQueue Определяет текущий размер, в байтах, внутренней очереди передачи драйвера. Нулевое значение свидетельствует о недоступности данного параметра. dwCurrentRxQueue Определяет текущий размер, в байтах, внутренней очереди приема драйвера. Нулевое значение свидетельствует о недоступности данного параметра. |
Среды: Smalltalk80 MicroCap Local bus Bios Pci 12С ML Микроконтроллеры: Atmel Intel Holtek AVR MSP430 Microchip Книги: Емкостный датчик 500 схем для радиолюбителей часть 2 (4) Структура компьютерных программ Автоматическая коммутация Кондиционирование и вентиляция Ошибки при монтаже Схемы звуковоспроизведения Дроссели для питания Блоки питания Детекторы перемещения Теория электропривода Адаптивное управление Измерение параметров Печатная плата pcad pcb Физика цвета Управлении софтверными проектами Математический аппарат Битовые строки Микроконтроллер nios Команды управления выполнением программы Перехода от ahdl к vhdl Холодный спай Усилители hi-fi Электронные часы Сердечники из распылённого железа Анализ алгоритмов 8-разрядные КМОП Классификация МПК История Устройства автоматики Системы и сети Частотность Справочник микросхем Вторичного электропитания Типы видеомониторов Радиобиблиотека Электронные системы Бесконтекстный язык Управление техническими системами Монтаж печатных плат Работа с коммуникациями Создание библиотечного компонента Нейрокомпьютерная техника Parser Пи-регулятор ч.1 ПИ-регулятор ч.2 Обработка списков Интегральные схемы Шина ISAВ Шина PCI Прикладная криптография Нетематическое: Взрывной автогидролиз Нечеткая логика Бытовые установки (укр) Автоматизация проектирования Сбор и защита Дискретная математика Kb радиостанция Энергетика Ретро: Прием в автомобиле Управление шаговым двигателем Магнитная запись Ремонт микроволновки Дискретные системы часть 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||