Страница 8 из 27
7.1.4 Определение статуса коммуникационного порта. Регистр статуса линии микросхемы UART 8250 определяет протокол связи. Этот регистр имеет адрес порта на 5 больше, чем базовый адрес данного канала. Обычно он постоянно просматривается в про- цессе коммуникационного обмена. При передаче данных регистр сооб- щает, что предыдущий символ уже послан, позволяя программе запи- сать новый символ поверх его. При приеме данных регистр информи- рует программу о поступлении следующего символа, с тем чтобы программа могла прочитать его прежде чем он будет уничтожен сле- дующим прибывшим. Значение битов этого регистра следующее:
бит 0 1 = байт данных получен 1 1 = полученные данные были перезаписаны (предыдущий символ не был вовремя считан) 2 1 = ошибка четности (вероятно, из-за шума в линии) 3 1 = ошибка окружения (передача не синхронизована) 4 1 = обнаружен перерыв (получена длинная строка единиц, индицирующая, что другая станция запрашивает конец передачи) 5 1 = регистр хранения передатчика пуст (в этот регистр должны помещаться передаваемые данные) 6 1 = регистр сдвига передатчика пуст (этот регистр по- лучает данные из регистра хранения и преобразует их в последовательный вид) 7 1 = таймаут (устройство не связано с машиной)
Высокий уровень. В Бейсике сначала определите базовый адрес используемого ком- муникационного порта, затем добавьте к нему 5 и используйте опе- ратор INP для получения байта из этого порта. В приложении Б объясняется как в Бейсике производятся битовые операции, которые необходимо проделать программе, чтобы интерпретировать значение этого байта. В следующем примере проверяется бит наличия переры- ва:
100 DEF SEG = &H40 'указываем на область данных BIOS 110 ADDR = PEEK(4)+PEEK(5)*256 'вычисляем адрес COM2 120 X = INP(ADDR+5) 'вычисляем адрес регистра статуса 130 IF X AND 16 THEN 500 'переход на подпр-му, если бит 4 = 1 . . 500 '''начинаем процедуру обработки перерыва
Средний уровень. Функция 3 прерывания 14H BIOS возвращает в AH регистр статуса линии (AL получает регистр статуса модема [7.1.5]). При входе DX должен содержать номер коммуникационного порта, к которому осу-
ществляется доступ, где COM1 = 0, а COM2 = 1. Как и предыдущий пример, этот проверяет наличие перерыва:
MOV AH,3 ;номер функции MOV DX,1 ;выбираем COM2 INT 14H ;получаем байт статуса TEST AH,10000B ;обнаружен перерыв? 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 ;если да, то на обработку перерыва
|