|
|
Работа с аппаратурой под Windows
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
|
|