Робота з Com портом під Windows, Delphi, Програмування, статті

Михайло Голованов, Майстри Delphi

Введення

Одного разу в студену зимову пору … Отже на відміну від 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

      

    Увага! Передрук даної статті або її частини без узгодження з автором. Якщо ви хочете мати цю статтю на своєму сайті або видати в друкованому вигляді, зв’яжіться з автором.
    Автор статті:  Михайло Голованов

      

    Схожі статті:


    Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

    Коментарів поки що немає.

    Ваш отзыв

    Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

    *

    *