та, например, CS500. Значение по умолчанию 1000, если
указан параметр RS, в этом случае 0.
DS Вызывает проверку линии "Готовность набора данных"
(Data set ready). Допускается необязательный параметр,
как и для CS. Значение по умолчанию 1000.
CD Вызывает проверку линии "Определение носителя" (Carrier
detect). Допускается необязательный временной параметр,
как и для CS. Значение по умолчанию 0.
LF Вызывает автоматическую подачу кода перевода строки
(ASCII 10) после каждого символа возврата каретки (AS-
CII 13). Используется для последовательного вывода на
принтер.
PE Разрешает проверку четности, вызывая ошибку таймаута
устройства при возникновении ошибки четности.
Эти специальные команды могут помещаться в любом месте опера-
тора OPEN "COM" и в любом порядке. Отметим, что обычно сигналы
CTS и DSR должны быть установлены, чтобы оператор OPEN выполнил-
ся, а иначе будет выдана ошибка таймаута устройства. В заключение
приводим оператор OPEN "COM", содержащий все параметры, кроме RS
и LF:
OPEN "COM1:1200,O,7,1,CS2000,DS2000,CD,PE" AS #1 LEN = 256
Средний уровень.
Функция 0 прерывания 14H BIOS инициализирует порт коммуника-
ции. В DX должен даваться номер коммуникационного канала (COM1 =
0, COM2 = 1). В AL должен содержаться байт инициализационных
данных, значение битов которого следующее:
биты 1-0 длина слова. 10 = 7 битов, 11 = 8 битов.
2 число стоп-битов. 0 = 1, 1 = 2.
4-3 четность. 00 или 10 = нет, 01 = нечет., 11 = чет.
7-5 скорость обмена. 000 = 110 бод
001 = 150 бод
010 = 300 бод
011 = 600 бод
100 = 1200 бод
101 = 2400 бод
110 = 4800 бод
111 = 9600 бод
В данном примере порт инициализируется со словом в 8 битов,
одним стоп-битом и четной четностью. Скорость обмена 1200 бод.
;---присваиваем значения параметров переменным
MOV WORDLENGTH,00000011B ;длина слова 8 битов
MOV STOPBITS,00000000B ;1 стоп-бит
MOV PARITY,00011000B ;четная четность
MOV BAUDRATE,10000000B ;скорость 1200 бод
;---инициализируем COM1
MOV AL,0 ;чистим AL
OR AL,WORDLENGTH ;устанавливаем нужные биты
OR AL,STOPBITS ;
OR AL,PARITY ;
OR AL,BAUDRATE ;
MOV AH,0 ;функция инициализации порта
MOV DX,0 ;выбираем COM1
INT 14H ;инициализируем порт
Hизкий уровень.
Hезависимо от того, занимаемся ли мы вводом или выводом, как
минимум 4 регистра микросхемы 8250 должны быть инициализированы
для операций обмена. Это регистры делителя скорости обмена, ре-
гистр контроля линии и регистр разрешения прерывания.
Инициализация скорости обмена.
Делитель скорости обмена это число, на которое надо разделить
частоту системных часов (1190000 герц), чтобы получить желаемую
скорость обмена. Hапример, для скорости обмена 1200 бод делитель
скорости обмена должен быть равен 96, поскольку 1190000/96 приб-
лиженно равно 1200. Чем больше делитель, тем меньше скорость
обмена. Скорости обмена 300 и меньше требуют двухбайтного числа
для делителя. Старший байт посылается в 3F9H (или 2F9H), а млад-
ший в 3F8H (2F8H). В обоих случаях бит 7 регистра управления
линии должен быть установлен в 1 перед засылкой значений; в про-
тивном случае по этим двум адресам значения будут адресованы в
другие регистры (см. [7.1.0]). Вот некоторые значения, требуемые
для обычных скоростей обмена:
Скорость обмена 3F9H 3F8H
110 04H 17H
300 01H 80H
600 00H C0H
1200 00H 60H
1800 00H 40H
2400 00H 30H
3600 00H 20H
4800 00H 18H
9600 00H 0CH
Всегда устанавливайте регистры скорости обмена первыми, так
как они единственные, которые требуют, чтобы был установлен бит 7
в регистре контроля линии. После этого надо изменить содержимое
регистра контроля линии, сбрасывая 7-й бит, чтобы все остальные
доступы к регистрам были правильными. Поскольку регистр контроля
линии является регистром только для записи, то нет способа вер-
нуть бит 7 обратно в 1 без одновременной установки всех остальных
битов этого регистра. Отметим, что PCjr использует другие делите-
ли, описание которых Вы можете найти в техническом руководстве.
Инициализация регистра контроля линии.
Значение битов регистра контроля линии, адрес порта которого
равен 3FBH (или 2FBH), следующее:
биты 1-0 Длина символа. 00 = 5 битов, 01 = 6 битов
10 = 7 битов, 11 = 8 битов
2 Число стоп-битов. 0 = 1, 1 = 1.5, если длина
пяти, иначе 2.
3 Четность. 1 = генерируется бит четности, 0 = нет.
4 Тип четности. 0 = нечетная, 1 = четная
5 Фиксация четности. Заставляет бит четности всегда
быть 0 или 1. 0 = отменена
1 = всегда 1, если бит 3 = 1 & бит 4 = 0
или 1 = всегда 0, если бит 3 = 1 & бит 4 = 1
или 1 = нет четности, если бит 3 = 0
6 Установка перерыва. Вызывает вывод строки нулей
в качестве сигнала отдаленной станции.
0 = запрещено, 1 = перерыв
7 Меняет адреса портов других регистров
Обычно биты 5-7 сброшены в 0. Остальные описывают значения, опре-
деляемые протоколом обмена.
Регистр разрешения прерывания.
Даже если Вы не используете прерывания, все равно Вы должны
произвести запись в регистр разрешения прерывания, чтобы быть
уверенным, что прерывания запрещены. Просто поместите в этот
регистр 0. Регистр идентификации прерывания можно игнорировать.
Инициализация остальных регистров связана с модемами. Ясно,
что модемы нужны только для связи с удаленными устройствами, а не
для управления близлежащими устройствами, такими как последова-
тельный принтер. В [7.1.5] объяснено как инициализировать регистр
контроля модема.
В данном примере из области данных BIOS берется базовый адрес
COM1, после чего различные регистры инициализируются для скорости
обмена 1200 бод, семибитных данных, четной четности и одного
стоп-бита.
;---получаем базовый адрес COM1
MOV AX,40H ;ES указывает на область данных BIOS
MOV ES,AX ;
MOV DX,ES:[0] ;получаем базовый адрес COM1
;---инициализируеи регистры делителя скорости обмена на 1200 бод
ADD DX,3 ;указываем на регистр контроля линии
MOV AL,10000000B ;устанавливаем бит 7
OUT DX,AL ;посылаем байт
DEC DX ;указываем на старший байт делителя
DEC DX ;скорости обмена
MOV AL,0 ;старший байт для 1200 бод
OUT DX,AL ;посылаем старший байт для 1200 бод
DEC DX ;указываем на младший байт делителя
MOV AL,60H ;младший байт делителя для 1200 бод
OUT DX,AL ;посылаем младший байт
;---инициализируем регистр контроля линии
MOV AL,0 ;обнуляем AL
OR AL,10B ;длина данных 7 битов
OR AL,000B ;1 стоп-бит
OR AL,1000B ;генерируется бит четности
OR AL,10000B ;четная четность
ADD DX,3 ;указывае на регистр контроля линии
OUT DX,AL ;посылаем инициализационное значение
;---инициализируем регистр разрешения прерывания
DEC DX ;указываем на регистр разрешения
DEC DX ;прерывания
MOV AL,0 ;запрещаем прерывания
OUT DX,AL ;посылаем байт
7.1.3 Установка текущего коммуникационного порта.
Имеются два способа, которыми программа может определить,
какой из коммуникационных портов должен использоваться. Один из
способов состоит в указании номера канала в операторе программы.
Второй способ состоит в написании программы для обмена через порт
COM1, но изменении коммуникационного адаптера, доступ к которому
идет через COM1.
Область данных BIOS содержит место для четырех 2-хбайтных
переменных, которые содержат базовые адреса коммуникационных
каналов (MS DOS поддерживает только первые два из них). Базовый
адрес порта это младший из группы адресов портов, через которые
можно получить доступ к данному коммуникационному каналу. Базовый
адрес для COM1 хранится в ячейке 0040:0000, а для COM2 - в ячейке
0040:0002. Для смены коммуникационных портов надо просто поменять
эти два значения. Повторная смена значений приведет к первона-
чальному назначению портов.
Высокий уровень.
В Бейсике оператор OPEN "COM" может использоваться в виде OPEN
C$+"1200,N,8" AS #2, где C$ может быть либо "COM1:", либо
"COM2:". В качестве альтернативы можно использовать PEEK и POKE
для обмена базовых адресов:
100 DEF SEG = &H40 'указываем на область данных BIOS
110 X = PEEK(0): Y = PEEK(1) 'запоминаем первые 2 байта
120 POKE 0,PEEK(2): POKE 1,PEEK(3) 'переносим 2-е два байта
130 POKE 2,X: POKE 3,Y 'засылаем запомненные значения
Средний уровень.
Если программа обращается к коммуникационному порту через
прерывание 14H BIOS, то COM порт определяется содержимым DX,
которое равно 0 или 1 (для COM1 или COM2). Вместо того, чтобы
присваивать DX непосредственное значение, заполняйте его из пере-
менной, которой может быть присвоено значение 0 или 1. Программы,
использующие коммуникационные функции 3 и 4 прерывания 21H всегда
адресуются к COM1. В этом случае надо поменять базовые адреса:
;---обмен базовых адресов для COM1 и COM2
MOV AX,40H ;ES указывает на область данных BIOS
MOV ES,AX ;
MOV DX,ES:[0] ;помещаем 1-й базовый адрес в DX
MOV AX,ES:[2] ;помещаем 2-й базовый адрес в AX
MOV ES:[0],AX ;обмениваем адреса
MOV ES:[2],DX ;
7.1.4 Определение статуса коммуникационного порта.
Регистр статуса линии микросхемы UART 8250 определяет протокол
связи. Этот регистр имеет адрес порта на 5 больше, чем базовый
адрес данного канала. Обычно он постоянно просматривается в про-
цессе коммуникационного обмена. При передаче данных регистр сооб-
щает, что предыдущий символ уже послан, позволяя программе запи-
сать новый символ поверх его. При приеме данных регистр информи-
рует программу о поступлении следующего символа, с тем чтобы
программа могла прочитать его прежде чем он будет уничтожен сле-
дующим прибывшим. Значение битов этого регистра следующее:
бит 0 1 = байт данных получен
1 1 = полученные данные были перезаписаны (предыдущий
символ не был вовремя считан)
2 1 = ошибка четности (вероятно, из-за шума в линии)
3 1 = ошибка окружения (передача не синхронизована)
4 1 = обнаружен перерыв (получена длинная строка единиц,
индицирующая, что другая станция запрашивает
конец передачи)
5 1 = регистр хранения передатчика пуст (в этот регистр
должны помещаться передаваемые данные)
6 1 = регистр сдвига передатчика пуст (этот регистр по-
лучает данные из регистра хранения и преобразует
их в последовательный вид)
7 1 = таймаут (устройство не связано с машиной)