COM-порт в Windows (программирование): различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
м bad link repair
Строка 1:
Написать программу, управляющую устройством через [[COM-порт]], для [[MS-DOS]] не так сложно.
С платформой Win32 дело обстоит сложнее. Но только на первый взгляд. Конечно напрямую работать с [[регистр|регистрами]]ами портов нельзя, [[Windows]] это не позволяет, зато можно не обращать внимания на тонкости различных [[реализация|реализаций]] (i8055, 16450, 16550A) и не возиться с обработкой [[прерывание|прерываний]].
 
{{Wikify}}
 
== Открытие порта ==
С последовательными и параллельными портами в [[Win32]] работают как с [[файл|файлами]]ами. Для открытия порта используется функция <code>CreateFile</code>. Эта функция предоставляется [[Win32]] [[API]]. Ее прототип выглядит так:
 
HANDLE CreateFile(
Строка 19:
=== lpFileName ===
 
Указатель]] на [[строка|строку]] с именем открываемого или создаваемого [[файл|файла]]а. [[Формат (программирование)|Формат]] этой строки может быть очень «хитрым». В частности можно указывать сетевые имена для доступа к файлам на других компьютерах. Можно открывать [[логический раздел|логические разделы]] или [[физический диск|физические диски]] и работать в обход [[файловая система|файловой системы]].
 
Последовательные порты имеют имена «COM1», «COM2», «COM3», «COM4» и так далее. Точно так же они назывались в [[MS-DOS (программирование)|MS-DOS]]. [[Параллельный порт|Параллельные порты]] называются «LPT1», «LPT2» и так далее.
Строка 25:
=== dwDesiredAccess ===
 
Задает тип [[доступ|доступа]]а к [[файл|файлу]]у. Возможно использование следующих значений:
* <code>0</code> Опрос атрибутов устройства без получения доступа к нему.
* <code>GENERIC_READ</code> Файл будет считываться.
Строка 33:
=== dwShareMode ===
 
Задает параметры [[совместный доступ|совместного доступа]] к [[файл|файлу]]у. Коммуникационные порты нельзя делать разделяемыми, поэтому данный параметр должен быть равен 0.
 
=== lpSecurityAttributes ===
 
Задает [[атрибут|атрибуты]]ы защиты файла. Поддерживается только в [[Windows NT (программирование)|Windows NT]]. Однако при работе с портами должен в любом случае равняться <code>NULL</code>.
 
=== dwCreationDistribution ===
Управляет [[режимам|режимами]]и автосоздания, автоусечения файла и им подобными. Для коммуникационных портов всегда должно задаваться <code>OPEN_EXISTING</code>.
 
=== dwFlagsAndAttributes ===
 
Задает атрибуты создаваемого файла. Так же управляет различными режимами [[обработк|обработки]]и. При работе с портом этот параметр должен быть или равным <code>0</code>, или <code>FILE_FLAG_OVERLAPPED</code>. Нулевое значение используется при [[синхронная работа|синхронной работе]] с портом, а <code>FILE_FLAG_OVERLAPPED</code> при [[асинхронная работа|асинхронной]], или другими словами, при фоновой обработке [[ввод|ввода]]а/[[вывод|вывода]]а. Подробнее про асинхронный ввод/вывод я расскажу позже.
 
=== hTemplateFile ===
 
Задает описатель файла-[[шаблон|шаблона]]а. При работе с портами всегда должен быть равен <code>NULL</code>.
 
При успешном открытии файла, в данном случае порта, [[функция (программирование)|функция]] возвращает [[дескриптор (программирование)|дескриптор]] (<code>[[HANDLE (программирование)|HANDLE]]</code>) файла. При ошибке [[|<code>INVALID_HANDLE_VALUEINVALID HANDLE VALUE</code>]]. Код [[ошибка|ошибки]] можно получитить вызвав функцию [[|<code>GetLastError</code>]].
 
== Закрытие порта ==
 
Открытый порт должен быть закрыт перед завершением работы [[программа|программы]]. В [[Win32 (программирование)|Win32]] закрытие объекта по его [[дескриптор|дескриптору]]у выполняет функция [[|<code>CloseHandle</code>]]:
 
BOOL CloseHandle(
Строка 77:
. . .
 
В данном [[пример|примере]]е открывается порт <code>СОМ2</code> для [[чтение|чтения]] и [[запись|записи]], используется синхронный режим обмена. Проверяется успешность открытия порта, при ошибке выводится сообщение и программа завершается. Если порт открыт успешно, то он закрывается.
 
== Структура DCB ==
 
Основные [[параметр|параметры]]ы последовательного порта описываются структурой <code>DCB</code>. Временные параметры структурой <code>COMMTIMEOUTS</code>. Существует еще несколько информационных и управляющих [[структура|структур]], но они используются реже. Настройка порта заключается в заполнении управляющих структур и последующем вызове функций настройки.
 
Основную информацию содержит структура <code>DCB</code>:
Строка 116:
} DCB;
 
Эта структура содержит почти всю управляющую [[информация|информацию]], которая в реальности располагается в различных [[регистр|регистрах]]ах последовательного порта.
 
Эта структура содержит почти всю управляющую [[информация|информацию]], которая в реальности располагается в различных [[регистр|регистрах]] последовательного порта.
 
=== DCBlength ===
 
Задает длину, в [[байт|байтах]]ах, структуры <code>DCB</code>. Используется для контроля корректности структуры при передаче ее адреса в функции настройки порта.
=== BaudRate ===
 
[[Скорость|Скорость]] передачи [[данные|данных]]. Возможно указание следующих констант: <code>CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000</code>. Эти константы соответствуют всем стандартным скоростям обмена. На самом деле, это поле содержит числовое значение скорости передачи, а константы просто являются [[символические имена|символическими именами]]. Поэтому можно указывать, например, и <code>CBR_9600</code>, и просто <code>9600</code>. Однако рекомендуется указывать символические [[константа|константы]].
=== fBinary ===
Строка 148 ⟶ 147 :
* DTR_CONTROL_DISABLE Запрещает использование линии DTR
* DTR_CONTROL_ENABLE Разрешает использование линии DTR
* DTR_CONTROL_HANDSHAKE Разрешает использование рукопожатия для выхода из ошибочных ситуаций. Этот режим используется, в частности, [[модемам|модемами]]и при восстановленни в ситуации [[потеря связи|потери связи]].
=== fDsrSensitivity ===
 
Задает чувствительсть коммуникационного [[драйвер|драйвера]]а к состоянию линии [[|<code>DSR</code>]]. Если это поле равно <code>TRUE</code>, то все принимаемые данные игнорируются драйвером (коммуникационный драйвер расположен в [[операционная система|операционной системе]]), за исключением тех, которые принимаются при установленом сигнале <code>DSR</code>.
=== fTXContinueOnXoff ===
Строка 164 ⟶ 163 :
=== fInX ===
 
Задает использование <code>XON/XOFF</code> управления потоком при приеме. Если это поле равно <code>TRUE</code>, то [[драйвер (программирование)|драйвер]] передает символ <code>XoffChar</code>, когда в приемном буфере находится более <code>XoffLim</code>, и <code>XonChar</code>, когда в приемном [[буфер|буфере]]е остается менее [[XonLim (программирование)|XonLim]] [[символ|символов]]ов.
 
=== fErrorChar ===
Строка 247 ⟶ 246 :
 
== Заполнение структуры DCB ==
 
== Структура COMMTIMEOUTS ==
 
== Заполнение структуры COMMTIMEOUTS ==
 
== Пример настройки порта ==
 
== Структура COMMPROP ==
 
== Стандартный диалог настройки порта ==
 
== Выделение памяти для структуры COMMPROP ==
 
== Прием и передача данных ==
 
== Сброс порта ==
 
== Пример настройки порта и выполнения чтения/записи данных. ==
 
----
 
{{Wikify}}