Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Программирование -> Delphi / Pascal -> Работа с Com портом под Windows


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


     

     
    Интересное в сети
     
    10 новых программ
    CodeLobster PHP Edition 3.7.2
    WinToFlash 0.7.0008
    Free Video to Flash Converter 4.7.24
    Total Commander v7.55
    aTunes 2.0.1
    Process Explorer v12.04
    Backup42 v3.0
    Predator 2.0.1
    FastStone Image Viewer 4.1
    Process Lasso 3.70.4
    FastStone Image Viewer 4.0
    Xion Audio Player 1.0.125
    Notepad GNU v.2.2.8.7.7
    K-Lite Codec Pack 5.3.0 Full


    Наши сервисы
    Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
    Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
    Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
    Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
     
    Это интересно
     

    Copyright © CompDoc.Ru
    При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.