Форма входа
Категории раздела
Delphi [24]
Статьи по программированию на Delphi.
html [42]
Статьи и помощь по html
I Love Bashorg
Главная » Статьи » Программирование » Delphi

Работа с 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



    Источник: http://www.delphimaster.ru/articles/comm/index.html
    Категория: Delphi | Добавил: Bombers (11.10.2009)
    Просмотров: 2429 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Суббота, 27.04.2024, 07:04
    Приветствую Вас Гость
    Статистика
  • Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Admin icq status
    587643917
    Друзья сайта