Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
uart.doc
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
216.58 Кб
Скачать

2.8. Отримання даних

Як тільки ініціалізувати комунікаційний порт [2] і встановлений зв'язок з віддаленою станцією [5] - комунікаційна програма готова приймати дані. Прийом даних ніколи повністю не відділений від їх передачі, оскільки програмі може стати потрібним послати сигнал XOFF (ASCII 19), щоб зупинити потік даних, якщо вони поступають дуже швидко і вона не встигає їх обробляти. Код XON (ASCII 17) повідомляє віддаленій станції, що можна продовжити передачу. Зазначимо, що PCjr не може приймати дані під час дискових операцій; щоб зняти це обмеження, треба застосовувати XON і XOFF.

У залежності від складності протоколу обміну дані, що приймаються можуть вимагати простої або складної обробки. Може бути отриманий будь-який код з набору керуючих кодів. Ті з них, які є обмежувачами даних, частіше виявляються при синхронному обміні. При виведенні отримуваних символів на екран враховуйте вплив символів переведення рядка (ASCII 10), оскільки деякі мови автоматично вставляють їх після кожного символа повернення каретки; в цьому випадку виключайте символи переведення рядка з даних, що приймаються, щоб уникнути пустих рядків при виведенні. На мал. 7.2 показана комунікаційна процедура, що включає також код передачі, який обговорюється в [6].

Середній рівень

Функція 2 переривання 14Н BIOS чекає символ з послідовного порту, вміщує його в AL при отриманні і потім повертається в програму. При вході треба помістити номер порту (0-1) в DX. При поверненні АХ рівний нулю, якщо не було помилки. Якщо AH не рівний 0, то може бути повернений байт статусу, в якому мають значення тільки 5 біт. Це наступні біти:

біт 1 помилка переповнення (новий символ поступив раніше, ніж був видалений старий)

2 помилка парності (ймовірно, через проблеми в лінії)

3 помилка оформлення (стартовий або стоп-біти невірні)

4 виявлена перерва (отриманий довгий рядок бітів 0)

5 помилка тайму-ауту (не отриманий сигнал DSR)

MS-DOS також надає комунікаційну функцію для прийому одного символа - функцію 3 переривання 21Н. Вона чекає символ з СОМ1 і вміщує його в AL. Зазначимо, що при цьому немає функції ініціалізації порту, яку треба робити за допомогою процедури BIOS або безпосередньо, як показано в [2]. По замовчуванні порт ініціалізується зі значеннями 2400 бод, немає контролю парності, один стоп-біт і 8 біт на символ. Ця функція не має ніяких переваг в порівнянні з функцією BIOS і не повертає інформації про статус.

Низький рівень

При отриманні даних без використання комунікаційного переривання [8] програма повинна постійно перевіряти регістр статусу лінії, адресу порту якого на 5 більша базової адреси комунікаційного адаптера, що використовується. Біт 0 цього регістра буде рівний нулю, поки не буде отриманий символ в регістрі даних приймача. Коли біт 0 стає рівним 1, треба негайно зчитати його з регістра, з тим щоб на нього не наклався наступний символ, що приймається. Після того як символ прочитаний, біт 0 знову стає рівним 0 і залишається таким, поки не прибуде новий символ.

Хоч про це ще не згадувалося, але ви повинні знати, що комунікаційні процедури звичайно створюють циклічний буфер для збору поступаючих символів. Ви повинні також знати, що якщо поступаючі дані подавати на екран з швидкістю 1200 бод, то процедура зсуву екрана BIOS не буде устигати і станеться переповнення. Просте розв'язання цих проблем складається у використанні комунікаційного переривання.

У наступному прикладі частково повторюється вміст попереднього параграфа, що відноситься до передачі символів. Як і в тому випадку, код починається з нескінченного циклу. Об'єднайте ці дві процедури з процедурами ініціалізації з [2] і [5] для створення закінченої процедури введення/виведення через комунікаційний канал.

KETRY: MOV DX, BASADR ;базова адреса

ADD DX, 5 ;вказуємо на регістр статусу лінії

IN AL, DX ;отримуємо байт статусу

TEST AL, 00011110В ;перевіряємо на помилку

JNZ ERRROUT ;якщо так, то на обробку помилки

TEST AL,00000001B ;перевіряємо, чи отримані дані

JNZ RECVE ;на процедуру прийому даних

TEST AL,00100000B ;перевіряємо готовність до передачі

JZ KETRY ;якщо немає, то на початок циклу

.

(тут розташована процедура передачі )

.

; отримуємо дані і виводимо їх на екран

RECVE: MOV DX,BASE_ADDRESS ;базова адреса

IN AL,DX ;читаємо отриманий символ

CMP AL,19 ;перевірка на XOFF

JE XOFF_ROUTINE

; (і т.д.)

MOV DL,AL ;готуємо символ для виведення на екран

MOV AH,2 ;функція виведення

INT 21Н ;виводимо його

JMP SHORT KETRY ;повертаємося на початок циклу

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]