
- •Національний університет “львівська політехніка”
- •Програмування послідовного інтерфейсу
- •Доступ до послідовного порту
- •Програмування мікросхеми uart 8250
- •Ініціалізація послідовного порту
- •Установка поточного комунікаційного порту
- •Визначення статусу комунікаційного порту
- •Ініціалізація і управління модемом
- •Передача даних
- •Отримання даних
Установка поточного комунікаційного порту
Є два способи, за допомогою яких програма може визначити, який з комунікаційних портів повинен використовуватися. Один з них – вказівка номера каналу в операторі програми. Другий спосіб – написання програми для обміну через порт СОМ1, але зміна комунікаційного адаптера, доступ до якого йде через СОМ 1.
Область даних BIOS містить місце для чотирьох двобайтовий змінних, в яких знаходяться базові адреси комунікаційних каналів (MS-DOS підтримує тільки перші два з них). Базова адреса порту - це молодша з групи адрес портів, через які можна отримати доступ до даного комунікаційного каналу. Базова адреса для СОМ1 зберігається в комірці 0040:0000, а для COM2 - в комірці 0040:0002. Для зміни комунікаційних портів треба просто поміняти ці два значення.
Середній рівень
Якщо програма звертається до комунікаційного порту через переривання 14Н BIOS, то СОМ-порт визначається в DX, що дорівнює 0 або 1 (для СОМ1 або COM2). Замість того щоб присвоювати DX безпосереднє значення, заповнюйте його зі змінної, якій може бути присвоєне значення 0 або 1. Программи, які використовують комунікаційні функції 3 і 4 переривання 21Н, завжди адресуються до СОМ1. У цьому випадку треба поміняти базові адреси:
; обмін базових адрес для СОМ1 і COM2
MOV AX, 40H ;ES вказує на область даних BIOS
MOV ES, AX
MOV DX, ES:[0] ;поміщуємо 1-у базову адресу в DX
MOV AX, ES:[2] ;поміщуємо 2-у базову адресу в AX
MOV ES: [0], АХ ;обмінюємо адреси
MOV ES:[2], DX
Визначення статусу комунікаційного порту
Регістр статусу лінії мікросхеми UART 8250 визначає протокол зв'язку. Цей регістр має адресу порту на 5 більшу, ніж базова адреса даного каналу. Звичайно він постійно переглядається в процесі комунікаційного обміну. При передачі даних регістр повідомляє, що попередній символ вже посланий, дозволяючи програмі записати новий символ. При прийомі даних регістр інформує програму про надходження наступного символа, з тим щоб програма могла прочитати його перед тим, як він буде знищений наступним прибулим. Значення бітів цього регістра наступні:
біт: 0 1 = байт даних отриманий
1 1 = отримані дані були перезаписані (попередній символ не був вчасно прочитаний)
2 1 = помилка парності (ймовірно, через шум в лінії)
3 1 = помилка оточення (передача не синхронізована)
4 1 = виявлена перерва (отриманий довгий рядок одиниць, який відображає, що інша станція запитує кінець передачі)
5 1 = регістр збереження передавача пустий (в цей регістр повинні вміщуватися дані, що передаються )
6 1 = регістр зсуву передавача пустий (цей регістр отримує дані з регістра зберігання і перетворює їх в послідовний вид)
7 1 = тайм-аут (пристрій не зв'язаний з машиною)
Середній рівень
Функція 3 переривання 14Н BIOS повертає в АН регістр статусу лінії (AL отримує регістр статусу модему [5]). При вході DX повинен містити номер комунікаційного порту, до якого здійснюється доступ, де СОМ1 = 0, а COM2 = 1. Перевіряється наявність перерви:
MOV AH, 3 ;номер функції
MOV DX, 1 ;вибираємо COM2
INT 14H ;отримуємо байт статусу
TEST AH, 10000В ;виявлена перерва?
JNZ BREAK_DETECT ;якщо так, то переходимо до процедури обробки
Низький рівень
З області даних BIOS прочитується базова адреса комунікаційного каналу, до нього додається 5, а потім з отриманої адреси порту прочитується байт статусу.
MOV AX, 40H ;ES вказує на область даних BIOS
MOV ES, AX
MOV DX, ES:[2] ;отримуємо базову адресу COM2
ADD DX, 5 ;додаємо 5 для регістра статусу
IN AL, DX ;отримуємо байт статусу
TEST AL, 10000B ;біт 5 встановлений?
JNZ BREAK_DETECT ;якщо так, то переходимо до обробки перерви