
- •Програмування послідовного інтерфейсу
- •Затверджено на засіданні кафедри
- •Рецензент Каркульовський в.І., канд. Техн.Наук.,доц.
- •Мета роботи
- •Короткі теоретичні відомості
- •2.1. Доступ до послідовного порту
- •2.2. Програмування мікросхеми uart 8250
- •2.3. Ініціалізація послідовного порту
- •2.4. Установка поточного комунікаційного порту
- •2.5. Визначення статусу комунікаційного порту
- •2.6. Ініціалізація і управління модемом
- •2.7. Передача даних
- •2.8. Отримання даних
- •2.9. Посилка/отримання даних за допомогою комунікаційного переривання
- •Контрольні запитання
- •Лабораторне завдання
- •Оформлення звіту
- •6. Лiтература
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 ;повертаємося на початок циклу