Работа с аппаратурой под Windows
Работа с аппаратурой под Windows
Работа с аппаратурой под Windows win api стандартизирует работу с оборудованием. Для получения доступа к аппаратуре используется следующая последовательность шагов: Получить handler устройства вызовом createfile с именем устройства. Более подробно см windows sdk help. Для управления устройством вызывать функции api для данного устройства, либо посылать ioctl(input - otput control) последнее через deviceioctl(подробно см windows sdk help). Закрыть устройство 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.