Работа с Com портом под Windows
Введение
Однажды в студеную зимнюю пору: Итак в отличие от DOS Win 9x,NT имеет другую идеологию
работы с аппаратурой. Если в нашем уважаемом старичке DOS драйвер мог быть написан на asm с прямым доступом к
портам, то в Win все немного сложнее. Почему ? Win, в отличие от DOS многозадазадачна, поэтому позволять
каждому приложению напрямую менять настройки аппаратуры нельзя, т.к при этом одна задача может не
знать об изменении состояния аппаратуры другой задачей. В принципе в Win 9x можно пользоваться in in - out 378h, однако по вышеизложенной причине это
нежелательно. Для написания программ, работающих с аппаратурой в Win используется API(интерфейс прикладных
программ). Данный интерфейс позволяет использовать системные сервисы Win из прикладухи. Реализация
API при этом
возлагается на драйверы. Для написания драйверов используется Win Driver Developer Kit (DDK)(для каждой Win95, 98,NT есть свой DDK). Кроме непосредственно API можно использовать IOCTL коды (этот способ
получил распространение еще в DOS),
однако это выходит за рамки данной статьи.
Работа с аппаратурой под Win.
Win API стандартизирует работу с
оборудованием. Для получения доступа к аппаратуре используется следующая
последовательность шагов:'
1. Получить Handler устройства вызовом CreateFile с именем устройства. Более подробно см Windows SDK Help.
2. Для управления устройством вызывать функции API для данного устройства, либо посылать IOCTL(input - otput control) последнее через DeviceIOCtl(подробно см Windows SDK Help).
3. Закрыть устройство CloseHandle(Handler);
Последовательный порт под Win
Открытие порта:
Var
FHandle: Thandle;
FHandle := CreateFile(
PChar(ComString),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
Параметр 1:
Имя порта - 'COM1', итд
Параметр 2:
режим открытия GENERIC_READ - чтение, GENERIC_WRITE - запись
Параметр 3:
режим разделения ресуртса. Примечание: 0 - неразделяемый (именно так описано
открытие последовательного порта в WIN SDK, другие режимы не проверял).
Параметр 4:
Режим безопасности. Имеет смысл в Windows NT, Windows 9x
игнорирует его.
Параметр 5:
Способ открытия. Для порта - OPEN_EXISTING - открыть, когда
устройство реально существует.
Параметр6:
режим наложения операций - FILE_FLAG_OVERLAPPED - разрешение таких операций.
При этом операции чтения - записи, требующие значительного времени, выполняются
фоново по отношению к основному потоку программы.
Параметр7:
шаблон файла, для последовательного порта - всегда 0.
В случае нормального открытия порта FHandle - дескриптор порта, при неудаче содержит значение INVALID_HANDLE_VALUE.
Закрытие порта:
Закрытие порта выполняется вызовом CloseHandle(FHandle).
Настройка параметров передачи (скорость, кол-во бит, стоп биты)
Структура данных о настройках порта (device control block) DCB содержит информацию о настройках порта. Поля структуры:
DWORD DCBlength; // sizeof(DCB)
DWORD BaudRate // Скорость передачи (baud rate). Есть стандартный набор
// скоростей: все константы скоростей выглядят как CBR_<число>.
//Пример CBR_9600, CBR_115200.
Flags
DWORD fBinary: // режим проверки символа Eof - включение данного режима Windows
// не поддерживает ( по крайней мере сейчас). Маска $01
DWORD fParity: //Контроль четности Маска $02 - включение контроля четности
DWORD fOutxCtsFlow: // Маска $04 - Включение контроля сигнала CTS при выводе байтов.
DWORD fOutxDsrFlow: // Маска $08 - Включение контроля сигнала DSR при выводе байтов.
DWORD fDtrControl: // Маска $30 - Тип контроля сигнала DTR: значения
DTR_CONTROL_DISABLE деактивация сигнала.
DTR_CONTROL_ENABLE конкретное значение сигнала можно задавать через
вызов EscapeCommFunction.
DTR_CONTROL_HANDSHAKE Автоматическое управление сигналом.
DWORD fDsrSensitivity: // Маска $40 - Включение контроля сигнала DSR.
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fOutX: // Маска $100. Включение режима работы по XON XOFF при передаче
DWORD fInX: // Маска $200 -//- при приеме
DWORD fErrorChar: // Маска $400. Разрешение замещения при ошибочном приеме
// (несовпадение четности) принятого байта на член структуры ErrorChar.
DWORD fNull: // Маска $800 enable null stripping - пропускать при приеме символы NULL
DWORD fRtsControl: // Маска $3000. Тип контроля:
RTS_CONTROL_DISABLE
RTS_CONTROL_ENABLE
RTS_CONTROL_HANDSHAKE Аналогично сигналу DTR
RTS_CONTROL_TOGGLE - Высокий уровень пока, есть данные для передачи.
DWORD fAbortOnError // Маска $4000. Прекращение операций
// чтения - записи при возникновении ошибок
DWORD fDummy2:17; // Не используются
Другие данные структуры
WORD wReserved; // Не используется
WORD XonLim; // минимальное число байт в приемном буфере до отправки символа XON
WORD XoffLim; // максимальное число байт в приемном буфере до отправки символа XOFF
BYTE ByteSize; // количество бит в байте от 4 до 8
BYTE Parity; // 0-4=no,odd,even,mark,space бит паритета,
BYTE StopBits; // 0,1,2 = 1, 1.5, 2 - стоп биты,
// 1,5 используются только при 5 битах в посылке для мелкосхемы 8250.
ONESTOPBIT 1 stop bit
ONE5STOPBITS 1.5 stop bits
TWOSTOPBITS 2 stop bits
char XonChar; // Tx and Rx XON символ
char XoffChar; // Tx and Rx XOFF символ
char ErrorChar; // Символ, которым заменяется ошибочно принятый байт
char EofChar; // end of input character
char EvtChar; // received event character
WORD wReserved1; // Не используется
Delphi имеет оболочку для DCB - TDCB.
Получить текущую конфигурацию порта можно функцией GetCommState(Fhandle:Handle; fDCB:TDCB).
Установить соответственно SetCommDCB.
После установки параметров порта. Читать и
писать можно через ReadFile и WriteFile.
Заключение
В данной заметке приведена лишь небольшая часть сведений о работе с последовательным
портом. Если хоть кому-нибудь это интересно и нужно напишите мне на mgoblin@mail.ru, я попробую вдохновиться на дальнейший труд. Любые замечания и исправления приветствуются по e-mail: mgoblin@mail.ru
Внимание! Запрещается перепечатка данной
статьи или ее части без согласования с автором. Если вы хотите разместить эту
статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи: Михаил Голованов
Источник: www.delphimaster.ru
|