2.4 Конфігурація СОМ-портів
Керування послідовним портом розділяється на дна етапу — попереднє конфигурування (Setup) апаратних засобів порту і поточне (оперативне) переключення режимів роботи прикладним або системним ПО. Конфигурування СОМ-порту залежить від його виконання. Порт на платі розширення конфигурується джамнерами на самій платі. Порт на системній платі конфигурується через BIOS Setup.
Конфигуруванню підлягають наступні параметри:
Базова адреса, що може мати значення 3F8h, 2F8h, 3E8h (3EOh, 338h) або 2E8h (2EOh, 238h). При ініціалізації BIOS перевіряє наявність портів по адресах саме в цьому порядку і привласнює виявленим портам логічні імена СОМ1, COM2, COM3 і COM4. Для PS/2 стандартними для портів СОМЗ-СОМ8 є адреси 3220h,3228h,4220h, 4228h, 5220h і 52281) відповідно.
Використовувана лінія запиту переривання: для СОМ1 і COM3 звичайно використовується IRQ4 або IRQ11, для COM2 і COM4 — IRQ3 або IRQ10. У принципі номер переривання можна призначати в довільних сполученнях з базовою адресою (номером порту), але деякі програми і драйвери набудовані на стандартні сполучення. Кожному портові, що відповідає апаратному перериванні, призначають окрему лінію, що не збігається з лініями запиту переривань інших пристроїв. Переривання необхідні для портів, до яких підключаються пристрої введення, UPS або модеми.
Режим роботи порту за замовчуванням (2400 біт/з, 7 біт даних, 1 стогін-битий і контроль парності), заданий при ініціалізації порту під час BIOS POST, може змінюватися в будь-який момент при настроюванні комунікаційних програм або командою DOS MODE COMx: із указівкою параметрів.
У процесі початкового тестування POST BIOS перевіряє наявність послідовних портів (регістрів UART 8250 або сумісних) по стандартних адресах і поміщає базові адреси виявлених портів в осередки ВІOS Data Area 0:0400, 0402, 0404, 0406. Ці осередки зберігають адреси портів з логічними іменами СОМ1-COM4. Нульове значення адреси є ознакою відсутності порту з даним номером. В осередки 0:047С, 047D, 047Е, 047F заносяться константи, що задають тайм-аут для портів.
Виявлені порти иніціалізуються на швидкість обміну 2400 біт/з, 7 біт даних з контролем на парність, 1 стоп-битий. Керуючі сигнали інтерфейсу DTR і RTS переводяться у вихідний стан («виключена» — позитивна напруга).
Порти підтримуються сервісом BIOS INT 14h, що забезпечує наступні функції:
00h — ініціалізація (установка швидкості обміну і формату посилок, заданих регістром AL; заборона джерел переривань). На сигнали DTR і RTS впливу не робить (після апаратного скидання вони пасивні).
0lh — висновок символу з регістра AL (без апаратних переривань). Активуються сигнали DTR і RTS, і після звільнення регістра THR у нього міститься виведений символ. Якщо за заданий час регістр не звільняється, фіксується помилка тайм-ауту і функція завершується.
02h — уведення символу (без апаратних переривань). Активується тільки сигнал DTR (RTS переходить у пасивний стан), і очікується готовність прийнятих даних, прийнятий символ міститься в регістр AL. Якщо за заданий час дані не отримані, функція завершується з помилкою тайм-ауту.
03h — опитування стану модему і лінії (читання регістрів MSR і LSR). Цю гарантовано швидку функцію звичайно викликають перед функціями введення/висновку щоб уникнути ризику чекання тайм-ауту.
2.5 Структури управління портами
У літературі, найчастіше, керування послідовним і паралельним портами описується на рівні регістрів цих портів, причому приклади програм приводяться мовою Assembler. Послідовний порт досить повільний пристрій, до того ж специфічний. Тому в програмах працюючих з портами використовуються переривання. Паралельний порт швидший, але теж повільний і не менш специфічний. Узяти хоча б можливість цього порту працювати в двох напрямках.
З послідовними і паралельними портами в Win32 працюють як з файлами, проте для правильного функціонування необхідно заповнити певні структури, які задають параметри роботи портів. Працюючи з портами починати треба з його відкриття як файлу. Для цього необхідно використовувати стандартні функції роботи з файлами open і fopen. При цьому необхідно скористатися функцією CreateFile. Ця функція описана у Win32 API. Її прототип виглядає так:
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
Функція має багато параметрів. Розглянемо короткий опис параметрів даної функції: lpFileName
Вказівник на рядок з ім'ям, що відкривається або створюваного файлу. Формат цього рядка може бути дуже складним. Зокрема можна вказувати мережеві імена для доступу до файлів на інших комп'ютерах. Можна відкривати логічні розділи або фізичні диски і працювати в обхід файлової системи. Послідовні порти мають імена "COM1", "COM2", "COM3", "COM4". Паралельні порти називаються "LPT1", "LPT2" і так далі. Необхідно врахувати, що якщо до порту СОМ1 підключена миша, Windows не дасть відкрити цей порт. Аналогічно не вдасться відкрити LPT1 якщо підключено принтер.
dwDesiredAccess Задає тип доступу до файлу. Можливе використання наступних значень:
0- Опитування атрибутів пристрою без одержання доступу до нього.
GENERIC_READ - Файл буде зчитуватися.
GENERIC_WRITE - Файл буде записуватися.
GENERIC_READ|GENERIC_WRITE- Файл буде і зчитуватися і записуватися.
dwShareMode
Задає параметри спільного доступу до файлу. Комунікаційні порти не можна робити роздільними, тому даний параметр повинний дорівнювати 0.
lpSecurityAttributes
Задає атрибути захисту файлу. Підтримується тільки в Windows NT. Однак при роботі з портами повинний у будь-якому випадку дорівнювати NULL.
dwCreationDistribution
Для комунікаційних портів даний параметр завжди повинен задаватися як OPEN_EXISTING.
dwFlagsAndAttributes
Задає атрибути створюваного файлу. Так само керує різними режимами обробки. Для наших цілей цей параметр повинний бути або рівним 0, або FILE_FLAG_OVERLAPPED. Нульове значення використовується при синхронній роботі з портом, а FILE_FLAG_OVERLAPPED при асинхронної, або іншими словами, при фоновій обробці введення/виведення.
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 У даному розділі диплома була розроблена автоматизована інформаційна система розрахунку прибутку на гірничо-збагачувальному підприємстві. Дана система була розроблена для підвищення ефективності роботи підприємства. В основу алгоритмів обробки даних покладені методи математичної статистики й оптимізаційні моделі. Для проектування і реалізації автоматизованої інформаційної ...
... ./ “_____”_________2009р. Виконавець Студент групи x /xxxxxx./ “_____”____________2009р. Харків 2009 ЗАТВЕРДЖЕНО xxx.03077-01 12 01-1-ЛЗ ВІРТУАЛЬНИЙ ВИМІРЮВАЛЬНИЙ КОМПЛЕКС НА БАЗІ УЧБОВОГО ЛАБОРАТОРНОГО СТЕНДУ EV8031 Текст програми xxxxx.03077-01 12 01-1 Аркушів _48_ Харків 2009 ЗМІСТ 1 ТЕКСТ ПРОГРАМНОГО ЗАБЕСПЕЧЕННЯ ...
... альної відповідальності відповідно до закону. 5.2 Оцінка умов, в яких проводилася дипломна робота Дипломна робота на тему “Підвищення ефективності інноваційної діяльності в умовах ВАТ “Дніпропетровський лакофарбовий завод ім. Ломоносова”” виконувалася у відділі цін та економічного аналізу ВАТ «ДЛФЗ». Дана робота розроблялась з використанням персональної електроно-обчислювальної машини (ПЕОМ ...
... і над плановим. Відомо, що собівартість є одним з головних джерел резервів підвищення ефективності роботи підприємства. Звідси сформуємо мету і задачі даної роботи. Метою даної роботи є підвищення ефективності роботи підприємства ВАТ «Дніпрополімермаш» шляхом управління собівартістю продукції. Відповідно, для досягнення поставленої мети необхідно вирішити наступні задачі: 1. Проаналізувати ...
0 комментариев