Смекни!
smekni.com

Візуальний облік вхідних даних інтерфейсу RS-232 (стр. 3 из 7)

hTemplateFile

Задає описувач файлу-шаблона. При роботі з портами завжди повинний дорівнювати NULL.

При успішному відкритті файлу, у нашому випадку порту, функція повертає описувач (HANDLE) файлу. При помилці INVALID_HANDLE_VALUE.

Відкритий порт повинний бути закритий перед завершенням роботи програми. У Win32 закриття об'єкта по його описувача виконує функція CloseHandle:

BOOL CloseHandle(

HANDLE hObject

);

Функція має єдиний параметр - описувач об'єкта, що закривається. При успішному завершенні функція повертає не нульове значення, при помилці нуль.

Відкривши порт ми отримуємо його у своє розпорядження. Тепер з портом може працювати тільки наша програма. Однак, перш ніж займатися введенням/виведенням, ми повинні настроїти порт. Це стосується тільки послідовних портів, для яких необхідно задати швидкість обміну, параметри парності, формат даних та інше. Крім того існує трохи специфічних для Windows параметрів. Мова йде про тайм-аути, що дозволяють контролювати як інтервал між прийнятими байтами, так і загальний час прийому повідомлення.

Основні параметри послідовного порту описуються структурою DCB. Тимчасові параметри структурою COMMTIMEOUTS. Настроювання порту полягає в заповненні керуючих структур і наступному виклику функцій настроювання.

Основну інформацію містить структура DCB:

typedef struct _DCB {

DWORD DCBlength; // sizeof(DCB)

DWORD BaudRate; // current baud rate

DWORD fBinary:1; // binary mode, no EOF check

DWORD fParity:1; // enable parity checking

DWORD fOutxCtsFlow:1; // CTS output flow control

DWORD fOutxDsrFlow:1; // DSR output flow control

DWORD fDtrControl:2; // DTR flow control type

DWORD fDsrSensitivity:1; // DSR sensitivity

DWORD fTXContinueOnXoff:1; // XOFF continues Tx

DWORD fOutX:1; // XON/XOFF out flow control

DWORD fInX:1; // XON/XOFF in flow control

DWORD fErrorChar:1; // enable error replacement

DWORD fNull:1; // enable null stripping

DWORD fRtsControl:2; // RTS flow control

DWORD fAbortOnError:1; // abort reads/writes on error

DWORD fDummy2:17; // reserved

WORD wReserved; // not currently used

WORD XonLim; // transmit XON threshold

WORD XoffLim; // transmit XOFF threshold

BYTE ByteSize; // number of bits/byte, 4-8

BYTE Parity; // 0-4=no,odd,even,mark,space

BYTE StopBits; // 0,1,2 = 1, 1.5, 2

char XonChar; // Tx and Rx XON character

char XoffChar; // Tx and Rx XOFF character

char ErrorChar; // error replacement character

char EofChar; // end of input character

char EvtChar; // received event character

WORD wReserved1; // reserved; do not use

} DCB;

Якщо уважно придивитися, то можна помітити, що ця структура містить майже всю керуючу інформацію, що у реальності розташовується в різних регістрах послідовного порту. Тепер розберемося, що означає кожне з полів найважливішої структури: DCBlength

Задає довжину, у байтах, структури DCB. Використовується для контролю коректності структури при передачі її адреси у функції настроювання порту.

BaudRate Швидкість передачі даних. Можлива вказівка наступних констант: CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000. Як видно, ці константи відповідають усім стандартним швидкостям обміну. Насправді, це поле містить числове значення швидкості передачі, а константи просто є символічними іменами. Тому можна вказувати, наприклад, і CBR_9600, і просто 9600. Однак рекомендується вказувати символічні константи.

fBinary

Включає двійковий режим обміну. Win32 не підтримує недвійковий режим, тому дане поле завжди повинне бути дорівнює 1, або логічній константі TRUE. У Windows 3.1, якщо це поле було дорівнює FALSE, включається текстовий режим обміну. У цьому режимі символ, що надійшов на вхід порту, заданий полем EofChar свідчив про кінець прийнятих даних.

fParity

Включає режим контролю парності. Якщо це поле дорівнює TRUE, то виконується перевірка парності, при помилці у програму, видається відповідний код завершення.

fOutxCtsFlow

Включає режим спостереження за сигналом CTS. Якщо це поле дорівнює TRUE і сигнал CTS скинутий, передача даних припиняється до установки сигналу CTS. Це дозволяє підключеному до комп'ютера приладу призупинити потік передачі в нього інформації, якщо він не встигає її обробляти.

fOutxDsrFlow

Включає режим спостереження за сигналом DSR. Якщо це поле дорівнює TRUE і сигнал DSR скинутий, передача даних припиняється до установки сигналу DSR.

fDtrControl

Задає режим керування обміном для сигналу DTR. Це поле може приймати наступні значення:

DTR_CONTROL_DISABLE - Забороняє використання лінії DTR

DTR_CONTROL_ENABLE - Дозволяє використання лінії DTR

DTR_CONTROL_HANDSHAKE - Дозволяє використання рукостискання для виходу з помилкових ситуацій. Цей режим використовується, зокрема, модемами при відновленні в ситуації втрати зв'язку.

fDsrSensitivity

Задає чутливість комунікаційного драйвера до стану лінії DSR. Якщо це поле дорівнює TRUE, то всі прийняті дані ігноруються драйвером (комунікаційний драйвер розташований в операційній системі), за винятком тих, котрі приймаються при установленом сигналі DSR.

fTXContinueOnXoff

Задає, чи припиняється передача при переповненні буфера прийому і передачі драйвером символу XoffChar. Якщо це поле дорівнює TRUE, то передача продовжується, незважаючи на те, що буфер прийому містить більш XoffLim символів і близький до переповнення, а драйвер передав символ XoffChar для призупинення потоку прийнятих даних. Якщо поле дорівнює FALSE, то передача не буде продовжена доти, поки в буфері прийомуне залишиться менше XonLim символів і драйвер не передасть символ XonChar для поновлення потоку прийнятих даних. У такий спосіб це поле вводить якусь залежність між керуванням вхідним і вихідним потоками інформації.

fOut

Задає використання XON/XOFF керування потоком при передачі. Якщо це поле дорівнює TRUE, то передача зупиняється при прийомі символу XoffChar, і відновляється при прийомі символу XonChar.

fIn

Задає використання XON/XOFF керування потоком при прийомі. Якщо це поле дорівнює TRUE, то драйвер передає символ XoffChar, коли в буфері прийому знаходиться більш ніж XoffLim і XonChar, коли в буфері залишається менш XonLim символів.

fErrorChar

Вказує на необхідність заміни символів з помилкою парності на символ, що задається полем ErrorChar. Якщо це поле дорівнює TRUE, і поле fParity дорівнює TRUE, то виконується заміна.

fNull

Визначає дія, яка виконується при прийомі нульового байта. Якщо це поле TRUE, то нульові байти відкидаються при передачі.

fRtsControl

Задає режим керування потоком для сигналу RTS. Якщо це поле дорівнює 0, то за замовчуванням мається на увазі RTS_CONTROL_HANDSHAKE. Поле може приймати одне з наступних значень:

RTS_CONTROL_DISABLE - Забороняє використання лінії RTS

RTS_CONTROL_ENABLE - Дозволяє використання лінії RTS

RTS_CONTROL_HANDSHAKE - Дозволяє використання RTS рукостискання. Драйвер встановлює сигнал RTS коли прийомний буфер заповнений менш, ніж на половину, і скидає, коли буфер заповнюється більш ніж на три чверті.

RTS_CONTROL_TOGGLE - Задає, що сигнал RTS встановлений, коли є дані для передачі. Коли всі символи з буфера передані, сигнал скидається.

fAbortOnError

Задає ігнорування всіх операцій читання/запису при виникненні помилки. Якщо це поле дорівнює TRUE, драйвер припиняє всі операції читання/запису для порту при виникненні помилки. Продовжувати працювати з портом можна буде тільки після усунення причини помилки і виклику функції ClearCommError.

fDummy2

Зарезервовано і не використовується.

wReserved

Не використовується і повино бути встановлене в 0.

XonLim

Задає мінімальне число символів в буфері прийому перед посилкою символу XON.

XoffLim

Визначає максимальну кількість байт у буфері прийому перед посилкою символу XOFF. Максимально припустима кількість байт у буфері обчислюється вирахуванням даного значення з розміру применого буфера в байтах.

ByteSize

Визначає число інформаційних біт у переданих і прийнятих байтах.

Parity

Визначає вибір схеми контролю парності. Дане поле повинне містити одне з наступних значень:

EVENPARITY

Доповнення до парності

MARKPARITY

Біт парності завжди 1

NOPARITY

Біт парності відсутній

ODDPARITY

Доповнення до непарності

SPACEPARITY

Біт парності завжди 0

StopBits

Задає кількість стопових біт. Поле може приймати наступні значення:

ONESTOPBIT- Один стоповый біт

ONE5STOPBIT - Півтора стоповых біта

TWOSTOPBIT - Два стоповых біти

XonChar

Задає символ XON, який використовується як для примйому, так і для передачі.

XoffChar

Задає символ XOFF, який використовується як для прийому, так і для передачі.

ErrorChar

Задає символ, що використовується для заміни символів з помилковою парністю.

EofChar

Задає символ, що використовується для сигналізації про кінець даних.

EvtChar

Задає символ, що використовується для сигналізації про подію.

wReserved1

Зарезервовано і не використовується.

Так, як поля структури DCB використовуються для конфигурування мікросхем портів, то на них накладаються певні обмеження. Розмір байта повинний бути 5, 6, 7 або 8 біт. Комбінація з п'яти бітного байта і двох стопових біт є неприпустимою. Так само як і комбінація із шести, семи або восьми бітного байта і півтора стопових біт.

Розглянута нами структура DCB найбільша з усіх, що використовуються для настроювання послідовних портів. Але вона і найважливіша. Заповнення всіх полів цієї структури може викликати ускладнення, тому що треба дуже чітко представляти як працює послідовний порт. Тому ручну установку полів можна порекомендувати досвідченим програмістам. Якщо ж Ви почуваєте себе не дуже упевнене, скористайтеся функцією BuildCommDCB, що дозволяє заповнити поля структури DCB на основі рядка, по синтаксисі аналогічному рядкові команди mode


3. ПРОЕКТНО-ПОЯСНЮВАЛЬНИЙ РОЗДІЛ

3.1 Вибір інструментальних засобів розробки програми

Найважливішим питанням, перед створенням – вибір інструментальних засобів, за допомогою яких буде реалізована програма.

В цьому напрямку потрібно розглянути наступні засоби:

Засоби низького рівня. Їх характеризує висока швидкодія, можливість написання коду програми на низькому рівні. До недоліків можна віднести відносну непрозорість коду, ускладнення самого кодування, яке вимагає створення програми, яка б працювала в захищеному режимі, що відповідно збільшує саму складність розробки даної програми, а також багато ручної роботи. Прикладами можуть бути Assembler та інші мови низького програмування.