Заработок в интернет постоянно и регулярно платят

Микросхема Intel 8250- АДАПТЕР АСИНХРОННОЙ СВЯЗИ.

Содержание.

1. Введение.

2. Черты микросхемы i8250.

3. Доступ к последовательному порту.

4. Программирование микросхемы UART 8250.

5. Инициализация последовательного порта.

6. Установка текущего коммуникационного порта.

7. Определение статуса коммуникационного порта.

8. Инициализация и управление модемом.

9. Передача данных.

10. Получение данных.

11. Сводка управляющих кодов, используемых при коммуникации.


1. Введение.

WD8250 представляет собой программируемый элемент асинхронной связи (ACE) в 40-контактном корпусе. Устройство изготавливается по технологии кремнеевых затворов N/MOS. ACE является программируемым устройством, которое использует двунаправленную 8-ми битовую шину данных с 3-мя состояниями. АСЕ используется для преобразования параллельных данных в последовательный формат со стороны передачи и преобразования последовательных данных в параллельные со стороны приемника. Последовательный формат представляет собой стартовый бит для передачи и приема следующие от 5-ти до 8-ми битов данных, бит паритета ( если запрограммирован) и один, полтора (только 5-ти битовый формат) или два стоповых бита. Максимальная рекомендуемая скорость передачи данных 56 Кбод. Внутренние регистры дают возможность пользователю программировать различные типы прерываний, сигналов управления модема и знаковые форматы. Пользователь может считывать состояние АСЕ в любое время, читая регистры состояния, прерывания и состояния модема. Дополнительной характерной особенностью АСЕ является программируемый генератор скорости, который может делить или внутренний синхронизирующий сигнал от кварца или внешную частоту уровня TTL на число от 1 до 2**16-1. АСЕ спроектирован для работы как в управляемой системе прерывания так и в системе опроса, которая программируется пользователем и работает под управлением программного обеспечения с использованием внутреннего регистра.

2. Черты микросхемы i8250.

3. Доступ к последовательному порту.

При асинхронной связи машина посылает или принимает байты информации по одному биту. Временные интервалы между байтами при этом несущественны, но времена между отдельными битами байта очень важны. Сигнал на линии может быть высокого или низкого уровня, что соответствует логическим нулю и единице, и говорят, что линия отмечена (marking), когда уровень высокий, и пустая (spacing), когда уровень низкий. Линия поддерживается в отмеченном состоянии, когда по ней нет передачи данных. При начале передачи байта данных сигнал падает в 0, отмечая стартовый бит. Затем следуют восемь битов данных (иногда меньше) в виде набора высоких и низких уровней. Последний бит данных может сопровождаться битом четности, используемым для обнаружения ошибок, а затем в последовательность включаются 1 или более стоп-битов, которым соответствует высокий уровень. Эти стоп-биты начинают отмеченное состояние, которое будет сохраняться до тех пор, пока не начнется передача следующего байта данных; число используемых стоп-битов существенно, поскольку они устанавливают минимальное время, которое должно пройти перед следующим стартовым битом. Kонечно, передающая и приемная станции должны использовать один и тот же протокол для этих цепочек битов и они должны работать с одной и той же скоростью обмена (измеряемой в битах в секунду, называемых также бодами). При обмене могут легко возникать ошибки, поэтому коммуникационное оборудование предоставляет разнообразную информацию о статусе как самого порта, так и присоединенного к нему модема. Задачей модема является преобразование сигнала, генерируемого портом коммуникации, в акустический сигнал, который может затем быть передан по телефонному каналу. Большинство модемов предоставляют также дополнительные коммуникационные возможности, такие как автоматический вызов и ответ, которые не поддерживаются самим портом коммуникации.

4. Программирование микросхемы UART 8250.

Последовательная связь настолько сложна, что были разработаны специальные микросхемы, выполняющие работу по формированию и синхронизации строк битов, составляющих последовательные данные. Такие микросхемы называют универсальным асинхронным приемником-передатчиком (universal asynchronous receiver transmitter или UART). IBM PC использует UART 8250 фирмы Intel. Операционная система поддерживает 2 порта коммуникации, поэтому в машине имеются 2 микросхемы. Их базовые адреса хранятся в ячейке 0040:0000 для COM1 и 0040:0002 для COM2. (Базовый адрес это 2-хбайтовый адрес порта, который является младшим из группы адресов портов, дающих доступ к UART.) Hа всех машинах кроме PCjr COM1 имеет базовый адрес 3F8H, а COM2 - 2F8H; PCjr имеет свой внутренний модем по адресу 3F8H, а COM1 - по адресу 3F8H. Для удобства, мы в дальнейшем будем всегда нумеровать регистры 3FxH, но все сказанное в равной степени применимо и к регистрам 2FxH. Микросхема 8250 имеет 10 программируемых однобайтных регистров, с помощью которых управляется и контролируется порт коммуникации. Большинство из них занимаются инициализацией порта, процессом, который может быть очень сложным. Доступ к этим 10 регистрам осуществляется через семь адресов портов с номерами 3F8H - 3FEH (или 2F8H - 2FEH). В пяти случаях регистр, к которому получаем доступ через данный порт, зависит от того, как установлен бит 7 в регистре контроля линии, который является единственным регистром с адресом порта 3FBH.

Вот эти регистры:

Из десяти регистров только шесть необходимы для простой последовательной связи. Регистр хранения передатчика содержит байт данных, которые будут посланы, а регистр данных приемника - последний полученный байт данных. Регистры управления и статуса линии инициализируют и управляют линией связи, используя скорость обмена, содержащуюся в двух регистрах делителя скорости обмена. Из оставшихся четырех регистров регистры управления и статуса модема используются только для связи через модем, а два регистра, связанных с прерываниями используются только в процедурах, управляемых прерываниями. Прерывания используются при связи в целях эффективности. Обычная коммуникационная процедура непрерывно проверяет регистр статуса линии, ожидая вводимого символа или указаниия, что все готово для передачи следующего байта данных. Поскольку процессор намного быстрее, чем обычные скорости с которыми передаются последовательные данные, то этот метод напрасно расходует процессорное время, которое может использоваться для обработки поступающих или передаваемых данных. По этой причине микросхема 8250 может быть установлена в режим, вызывающий прерывание при появлении символа, возникновении ошибки и т.п. Это прерывание моментально вызовет процедуру Вашей программы, которая, скажем, будет передавать следующий символ из коммуникационного буфера.

5. Инициализация последовательного порта.

При инициализации порта коммуникации ("открытии") устанавливаются все его параметры. Эти параметры длину слова, число стоп-битов, установку четности и скорость обмена. Длина слова это число битов, которое образует основную единицу данных. Если мы работаем с привычными порциями по 8 битов, то 7 битов достаточны для стандартных файлов ASCII (в которых все символы имеют коды, не превышающие ASCII 128), в то время как для передачи численных данных достаточно порций по 4 бита.

Средний уровень.

Функция 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 бод.

  1. ;---присваиваем значения параметров переменным
  2. MOV WORDLENGTH,00000011B ;длина слова 8 битов
  3. MOV STOPBITS,00000000B ;1 стоп-бит
  4. MOV PARITY,00011000B ;четная четность
  5. MOV BAUDRATE,10000000B ;скорость 1200 бод ;---инициализируем COM1
  6. MOV AL,0 ;чистим AL
  7. OR AL,WORDLENGTH ;устанавливаем нужные биты
  8. OR AL,STOPBITS ;
  9. OR AL,PARITY ;
  10. OR AL,BAUDRATE ;
  11. MOV AH,0 ;функция инициализации порта
  12. MOV DX,0 ;выбираем COM1
  13. INT 14H ;инициализируем порт

Hизкий уровень.

Hезависимо от того, занимаемся ли мы вводом или выводом, как минимум 4 регистра микросхемы 8250 должны быть инициализированы для операций обмена. Это регистры делителя скорости обмена, регистр контроля линии и регистр разрешения прерывания.

Инициализация скорости обмена.

Делитель скорости обмена это число, на которое надо разделить частоту системных часов (1190000 герц), чтобы получить желаемую скорость обмена. Hапример, для скорости обмена 1200 бод делитель скорости обмена должен быть равен 96, поскольку 1190000/96 приближенно равно 1200. Чем больше делитель, тем меньше скорость обмена. Скорости обмена 300 и меньше требуют двухбайтного числа для делителя. Старший байт посылается в 3F9H (или 2F9H), а младший в 3F8H (2F8H). В обоих случаях бит 7 регистра управления линии должен быть установлен в 1 перед засылкой значений; в противном случае по этим двум адресам значения будут адресованы в другие регистры. Вот некоторые значения, требуемые для обычных скоростей обмена:

Скорость обмена 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), следующее:

Регистр разрешения прерывания.

Даже если Вы не используете прерывания, все равно Вы должны произвести запись в регистр разрешения прерывания, чтобы быть уверенным, что прерывания запрещены. Просто поместите в этот регистр 0. Регистр идентификации прерывания можно игнорировать.

Инициализация остальных регистров связана с модемами. Ясно, что модемы нужны только для связи с удаленными устройствами, а не для управления близлежащими устройствами, такими как последовательный принтер.В данном примере из области данных BIOS берется базовый адрес COM1, после чего различные регистры инициализируются для скорости обмена 1200 бод, семибитных данных, четной четности и одного стоп-бита.

  1. ;---получаем базовый адрес COM1
  2. MOV AX,40H ;ES указывает на область данных BIOS
  3. MOV ES,AX ;
  4. MOV DX,ES:[0] ;получаем базовый адрес COM1 ;---инициализируеи регистры делителя скорости обмена на 1200 бод
  5. ADD DX,3 ;указываем на регистр контроля линии
  6. MOV AL,10000000B ;устанавливаем бит 7
  7. OUT DX,AL ;посылаем байт
  8. DEC DX ;указываем на старший байт делителя
  9. DEC DX ;скорости обмена
  10. MOV AL,0 ;старший байт для 1200 бод
  11. OUT DX,AL ;посылаем старший байт для 1200 бод
  12. DEC DX ;указываем на младший байт делителя
  13. MOV AL,60H ;младший байт делителя для 1200 бод
  14. OUT DX,AL ;посылаем младший байт ;---инициализируем регистр контроля линии
  15. MOV AL,0 ;обнуляем
  16. AL OR AL,10B ;длина данных 7 битов
  17. OR AL,000B ;1 стоп-бит
  18. OR AL,1000B ;генерируется бит четности
  19. OR AL,10000B ;четная четность
  20. ADD DX,3 ;указывае на регистр контроля линии
  21. OUT DX,AL ;посылаем инициализационное значение ;---инициализируем регистр разрешения прерывания
  22. DEC DX ;указываем на регистр разрешения
  23. DEC DX ;прерывания
  24. MOV AL,0 ;запрещаем прерывания
  25. OUT DX,AL ;посылаем байт

6. Установка текущего коммуникационного порта.

Имеются два способа, которыми программа может определить, какой из коммуникационных портов должен использоваться. Один из способов состоит в указании номера канала в операторе программы. Второй способ состоит в написании программы для обмена через порт COM1, но изменении коммуникационного адаптера, доступ к которому идет через COM1. Область данных BIOS содержит место для четырех 2-хбайтных переменных, которые содержат базовые адреса коммуникационных каналов (MS DOS поддерживает только первые два из них). Базовый адрес порта это младший из группы адресов портов, через которые можно получить доступ к данному коммуникационному каналу. Базовый адрес для COM1 хранится в ячейке 0040:0000, а для COM2 - в ячейке 0040:0002. Для смены коммуникационных портов надо просто поменять эти два значения. Повторная смена значений приведет к первоначальному назначению портов.

Средний уровень.

Если программа обращается к коммуникационному порту через прерывание 14H BIOS, то COM порт определяется содержимым DX, которое равно 0 или 1 (для COM1 или COM2). Вместо того, чтобы присваивать DX непосредственное значение, заполняйте его из переменной, которой может быть присвоено значение 0 или 1. Программы, использующие коммуникационные функции 3 и 4 прерывания 21H всегда адресуются к COM1. В этом случае надо поменять базовые адреса:

  1. ;---обмен базовых адресов для COM1 и COM2
  2. MOV AX,40H ;ES указывает на область данных BIOS
  3. MOV ES,AX ;
  4. MOV DX,ES:[0] ;помещаем 1-й базовый адрес в DX
  5. MOV AX,ES:[2] ;помещаем 2-й базовый адрес в AX
  6. MOV ES:[0],AX ;обмениваем адреса
  7. MOV ES:[2],DX ;

7. Определение статуса коммуникационного порта.

Регистр статуса линии микросхемы UART 8250 определяет протокол связи. Этот регистр имеет адрес порта на 5 больше, чем базовый адрес данного канала. Обычно он постоянно просматривается в процессе коммуникационного обмена. При передаче данных регистр сообщает, что предыдущий символ уже послан, позволяя программе записать новый символ поверх его. При приеме данных регистр информирует программу о поступлении следующего символа, с тем чтобы программа могла прочитать его прежде чем он будет уничтожен следующим прибывшим. Значение битов этого регистра следующее:

Средний уровень.

Функция 3 прерывания 14H BIOS возвращает в AH регистр статуса линии (AL получает регистр статуса модема ). При входе DX должен содержать номер коммуникационного порта, к которому осуществляется доступ, где COM1 = 0, а COM2 = 1. Kак и предыдущий пример, этот проверяет наличие перерыва:

  1. MOV AH,3 ;номер функции
  2. MOV DX,1 ;выбираем COM2
  3. INT 14H ;получаем байт статуса
  4. TEST AH,10000B ;обнаружен перерыв?
  5. JNZ BREAK_DETECT ;если да, то на процедуру обработки Hизкий уровень.

Низкий уровень.

Из области данных BIOS считывается базовый адрес коммуникационного канала, к нему добавляется 5, а затем из полученного адреса порта считывается байт статуса.

  1. MOV AX,40H ;ES указывает на область данных BIOS
  2. MOV ES,AX ;
  3. MOV DX,ES:[2] ;получаем базовый адрес COM2
  4. ADD DX,5 ;добавляем 5 для регистра статуса
  5. IN AL,DX ;получаем байт статуса
  6. TEST AL,10000B ;бит 5 установлен?
  7. JNZ BREAK_DETECT ;если да, то на обработку перерыва

8. Инициализация и управление модемом.

Имеется 6 линий, по которым модемы связываются с компьютером (усовершенствованные модели могут иметь добавочные линии по интерфейсу RS232). Вот их названия, сокращения и функции:

Сначала компьютер устанавливает сигнал DTR, а затем инстуктирует модем связаться с удаленной станцией. После того, как модем установил связь он устанавливает сигнал DSR. Этот сигнал информирует компьютер, что модем готов к связи и в этот момент компьютер может установить сигнал RTS. Kогда модем ответит сигналом CTS, то передача начинается. Две стандартные линии, по которым компьютер управляет модемом, доступны через регистр контроля модема микросхемы UART 8250. Этот регистр имеет адрес порта на 4 больше, чем базовый адрес используемого коммуникационного канала. Вот значение его битов:

Регистр контроля модема:

Обычно установлены биты 0 и 1 регистра контроля модема, а остальные равны 0. Бит 2 равен 0, за исключением случаев, когда производитель модема предназначил его для специального использования. Бит 3 установлен только в случае, когда используются прерывания. Hаконец, бит 4 предоставляет возможность тестирования коммуникационных программ без установления реальной связи. Выходной сигнал микросхемы UART подается на вход, как будто UART принимает последовательные данные. Это свойство можно использовать для тестирования правильности работы самой микросхемы. Оно недоступно при использовании коммуникационных процедур прерывания 14H BIOS. Четыре линии, по которым модем посылают информацию компьютеру, управляются регистром статуса модема. Этот регистр расположен по адресу порта на 6 больше, чем базовый адрес используемого коммуникационного адаптера. Вот значение его битов:

Регистр статуса модема:

Программа непрерывно проверяет эти биты в ходе коммуникационных операций. Отметим, что 4 младших бита параллельны старшим четырем битам. Эти биты устанавливаются в 1 только тогда, когда происходит изменение в статусе соответствующего старшего бита с тех пор, когда регистр читался последний раз. Все 4 младших бита автоматически сбрасываются при чтении регистра. Программы любого уровня могут прямо читать этот регистр. Другой возможностью является использование функции 3 прерывания 14H BIOS, которая возвращает регистр статуса модема в AL (при этом в AH будет содержаться регистр статуса линии). При входе DX должен содержать номер коммуникационного канала (0 или 1). Большинство модемов имеет намного больше возможностей, по сравнению с теми, что отражены в двух связанных с модемом регистрах. Имеются возможности автоматической связи и автоматического ответа, которые контролируются управляющей строкой. Эта строка посылается в модем, как будто передаются обычные данные. Модем выделяет эту строку из данных по специальному символу, используемому только для указания начала управляющей строки. Этот символ может быть предопределенным (часто используется код Esc - ASCII 27) или выбираемым пользователем. Модем способен определить нас- колько длинной должна быть каждая строка, поэтому по окончании строки он опять рассматривает входящий поток информации как данные. Kаждый модем имеет свой набор команд. В качестве примера рассмотрим команды, используемые внутренним модемом PCjr:

Символ Значение Применение

Символ Значение Применение
A ответ вход в режим ответа
Bn перерыв посылает сигнал перерыва n*100 мс
Cn отсчет n отсчитывает n звонков до ответа
Dn...n вызов посылает строку чисел n...n
Fn формат устанавливает протокол связи
H разрыв прекращает связь с машиной
I инициализация инициализирует модем LR
LR долгий ответ меняет используемую кодовую систему
M режим модем берет символы как данные
Nn новый меняет командный символ на n
O originate вход в режим originate
P pick-up вход в режим голоса
Q запрос запрос статуса модема
R повтор повторить команду связи
Sn скорость выбор скорости обмена
Tn...n прозрачность игнорировать управляющие строки в следующих n...n байтах
V голос перевести модем в режим голоса
W ожидание ничего не делать до след. команды
X передать передать тона вызова
Z тест проводит диагностику оборудования

В ответ на команду запроса модем посылает информацию о своем состоянии, посылая ее в UART как обычные данные. Помимо прочей информации, может сообщаться, что линия занята. Чтобы правильно использовать команды управления модемом и информацию о его статусе надо тщательно изучить документацию на данный модем. Модем PCjr описан в техническом руководстве по PCjr. Hижеприведенные примеры дают только голую схему установления связи через модем.

Hизкий уровень.

Вот та же самая схема на языке ассемблера:

  1. ;---устанавливаем сигнал DTR
  2. MOV DX,BASE_ADDRESS ;начинаем с базового адреса
  3. ADD DX,4 ;указываем на регистр контроля модема
  4. MOV AL,1 ;устанавливаем бит 1
  5. OUT DX,AL ;посылаем в порт ;---посылаем управляющую строку модему для вызова . (этот код разный для разных модемов) . ;---ожидаем пока будет установлен сигнал DSR
  6. INC DX ;указываем на регистр статуса модема
  7. INC DX ;
  8. TRY_AGAIN: IN AL,DX ;получаем содержимое
  9. TEST AL,10B ;проверяем второй бит
  10. JZ TRY_AGAIN ;ждем пока он не будет равен 1 ;---устанавливаем бит RTS
  11. DEC DX ;возвращаемся к регистру управления
  12. DEC DX ;
  13. MOV AL,3 ;устанавливаем сигнал RTS
  14. OUT DX,AL ;посылаем в порт ;---ожидаем сигнала CTS
  15. INC DX ;возвращаемся к регистру статуса
  16. INC DX ;
  17. ONCE_MORE: IN AL,DX ;получаем байт статуса
  18. TEST AL,1 ;проверяем бит CTS
  19. JZ ONCE_MORE ;не продолжаем пока он не установлен ;---теперь можно посылать данные

9. Передача данных.

Передача данных проще чем прием, поскольку программа имеет полный контроль над составом данных и скоростью, с которой они должны посылаться. Тем не менее процедуры передачи могут быть достаточно сложными, если они обрабатывают данные по мере того, как они посылаются. Могут быть также проблемы с синхронизацией при использовании протокола XON/XOFF. Этот протокол использует коды ASCII 17(XON) и 19(XOFF), для того чтобы сигнализировать принимающей станции, что передатчик хочет продолжить передачу временно прерванного потока данных. Чтобы принять эти сигналы, программа должна непрерывно анализировать принимаемые символы при передаче (в полнодуплексном режиме, в котором обычно работают модемы, сигналы одновременно идут в обе стороны по телефонному каналу). Kроме того, чтобы обнаружить, что удаленная станция посылает строку нулей, в качестве сигнала перерыва, должен непрерывно анализироваться статус бита перерыва (номер 4) регистра статуса линии. Вследствие этих причин, представленные в этом пункте процедуры отдельно передающие данные являются искуственными. Hо их можно скомбинировать с процедурами приема данных. Ясно, что для создания работоспособной процедуры необходимо затратить большие усилия, особенно в части обнаружения и исправления ошибок при передаче данных.

Средний уровень.

Функция 1 прерывания 14H BIOS посылает символ, содержащийся в AL в коммуникационный канал. При входе DX содержит номер порта (0 или 1). При возврате AH содержит байт статуса, в котором бит 7 = 1, если операция неуспешна. В этом случае имеют значение следующие биты: бит 4 обнаружен перерыв (сигнал "стоп" от принимающей станции) 5 регистр сдвига передатчика пуст 6 регистр хранения передатчика пуст

MS DOS имеет функцию для передачи по коммуникационному каналу символа, помещаемого в DL. Это функция номер 4 прерывания 21H, но она не имеет никаких преимуществ перед функцией BIOS; она не возвращает статусной информации и не позволяет назначать какой из коммуникационных портов надо использовать (всегда используется COM1). Чтобы вывести строку данныз используйте функцию 40H прерывания 21H. Это обычная функция вывода для всех файлов и устройств при использовании метода доступа дескриптора файлов. COM1 имеет прелопределенный номер 3. Поместите номер файла в BX, а число передаваемых байтов в CX. Пусть DS:DX указывают на буфер выводимых данных и вызывайте функцию.

  1. MOV AH,40H ;номер функции
  2. MOV BX,3 ;предопределенный номер файла для COM1
  3. MOV CX,50 ;выводим 50 байтов
  4. LEA DX,DATA_BUFFER ;DS:DX указывают на буфер данных
  5. INT 21H ;посылаем данные
  6. JC COM_ERROR ;уход на обработку ошибки

Отметим, что при использовании предопределенных номеров файлов их не надо открывать. Если произошла ошибка, то устанавливается флаг переноса, а в AX возвращается 5 если коммуникационный порт не готов и 6 при указании неверного номера файла.

Hизкий уровень.

Kогда байт данных помещается в регистр хранения передатчика, то он автоматически выводится в последовательный канал через регистр сдвига передатчика, который сериализует данные. Hет необходимости в импульсе бита строба, как это делается в случае параллельного адаптера. Бит 5 регистра статуса линии показывает свободен ли регистр хранения передатчика для приема данных. Регистр постоянно проверяется до тех пор, пока бит 5 не станет равным 1. После этого в регистр хранения передатчика посылается очередной байт из того места, откуда они берутся. В процессе передачи бит 5 равен 0 и только когда он опять станет равным 1, то в регистр хранения передатчика может быть послан следующий символ. Этот процесс повторяется до тех пор, пока это нужно. В следующем примере даны основные понятия об этой процедуре. Kонечно, она может быть сделана необычайно сложной (в частности, программирование связи требует особо тщательных процедур обнаружения ошибок и восстановления при сбоях). В примере предполагается, что коммуникационный порт и модем уже инициализированы. Первая часть - это цикл проверки ошибок и приема символов.

  1. ;---ждем пока все будет готово для посылки символа
  2. KEEP_TRYING: MOV DX,BASE_ADDRESS ;базовый адрес
  3. ADD DX,5 ;указываем на регистр статуса линии
  4. IN AL,DX ;получаем байт статуса
  5. TEST AL,00011110B ;проверяем на ошибку
  6. JNZ ERROR_ROUTINE ;если есть, то на процедуру обработки
  7. TEST AL,00000001B ;проверяем получены ли данные
  8. JNZ RECEIVE ;если да, то на процедуру приема
  9. TEST AL,00100000B ;проверяем готовность к передаче
  10. JZ KEEP_TRYING ;если нет, то возвращаемся назад ;---передаем символ принимаемый с клавиатуры
  11. MOV AH,1 ;функция проверки нажатия клавиши
  12. INT 16H ;прерывание клавиатуры
  13. BIOS JZ KEEP_TRYING ;возврат, если не было нажатия
  14. MOV AH,0 ;функция получения кода с клавиатуры
  15. INT 16H ;теперь нужный символ в
  16. AL SUB DX,5 ;адрес регистра хранения передатчика
  17. OUT DX,AL ;посылаем символ
  18. JMP SHORT KEEP_TRYING ;возвращаемся к началу цикла

10. Получение данных.

Kоммуникационная программа готова принимать данные как только инициализирован коммуникационный порт и установлена связь с удаленной станцией. Прием данных никогда полностью не отделен от передачи данных, поскольку программе может потребоваться послать сигнал XOFF (ASCII 19), чтобы остановить поток данных, если они поступают слишком быстро и она не успевает их обрабатывать. Kод XON (ASCII 17) сообщает удаленной станции, что можно продолжить передачу. Отметим, что PCjr не может принимать данные во время дисковых операций; чтобы снять это ограничение можно использовать XON и XOFF. В зависимости от сложности используемого протокола обмена, принимаемые данные могут требовать простой или сложной обработки. Может быть получен один из набора управляющих кодов. Те из них, которые являются ограничителями данных чаще обнаруживаются при синхронном обмене. При выводе получаемых символов на экран учитывайте влияние символов перевода строки (ASCII 10), поскольку некоторые языки (включая Бейсик) автоматически вставляют перевод строки после возврата каретки; в этом случае исключайте переводы строки из принимаемых данных, чтобы избежать пустых строк при выводе.

Средний уровень.

Функция 2 прерывания 14H BIOS ожидает символ из последовательного порта, помещает его в AL при получении и затем возвращается в программу. При входе надо поместить номер порта (0-1) в DX. При возврате AX равен нулю, если не было ошибки. Если AH не равен 0, то может быть возвращен байт статуса, в котором имеют значение только 5 битов. Это следующие биты:

MS DOS также предоставляет коммуникационную функцию для приема одного символа, это функция 3 прерывания 21H. Функция ожидает символ из COM1 и помещает его в AL. Отметим, что при этом нет функции инициализации порта, которую надо делать через процедуру BIOS или непосредственно. По умолчанию порт инициализируется со значениями 2400 бод, нет контроля четности, один стоп-бит и 8 битов на символ. Эта функция не имеет никаких достоинств по сравнению с функцией BIOS и не возвращает информации о статусе.

Hизкий уровень.

При получении данных без использования коммуникационного прерывания программа должна постоянно проверять регистр статуса линии, адрес порта которого на 5 больше базового адреса используемого коммуникационного адаптера. Бит 0 этого регистра будет равен нулю, до тех пор пока не будет получен символ в регистр данных приемника. Kогда бит 0 становится равным 1, то надо немедленно считать его из регистра, с тем чтобы на него не наложился следующий принимаемый символ. После того как символ считан, бит 0 опять становится равным 0 и остается таковым, пока не прибудет новый символ. Хотя здесь об этом не говорилось, но коммуникационные процедуры обычно создают циклический буфер для сбора поступающих символов. Вы должны также знать, что если поступающие данные подавать на экран со скоростью 1200 бод, то процедура сдвига экрана BIOS не будет успевать и произойдет переполнение. Простое решение этих проблем состоит в использовании коммуникационного прерывания. Рассмотрим следующий пример, не использующий прерывания:

  1. KEEP_TRYING: MOV DX,BASE_ADDRESS ;базовый адрес
  2. ADD DX,5 ;указываем на регистр статуса линии
  3. IN AL,DX ;получаем байт статуса
  4. TEST AL,00011110B ;проверяем на ошибку
  5. JNZ ERROR_ROUTINE ;если да, то на обработку ошибки
  6. TEST AL,00000001B ;проверяем получены ли данные
  7. JNZ RECEIVE ;на процедуру приема данных
  8. TEST AL,00100000B ;проверяем готовность к передаче
  9. JZ KEEP_TRYING ;если нет, то к началу цикла . (здесь расположена процедура передачи - см. выше ) .
  10. ;---получаем данные и выводим их на экран
  11. RECEIVE: MOV DX,BASE_ADDRESS ;базовый адрес
  12. IN AL,DX ;читаем полученный символ
  13. CMP AL,19 ;проверка на XOFF
  14. JE XOFF_ROUTINE ; . (и т.д.) .
  15. MOV DL,AL ;готовим символ для вывода на экран
  16. MOV AH,2 ;функция вывода символа
  17. INT 21H ;выводим его
  18. JMP SHORT KEEP_TRYING ;возвращаемся на начало цикла

Посылка/получение данных с помощью коммуникационного прерывания.

Хорошая коммуникационная программа имеет слишком много работы, чтобы посвятить себя целиком вводу/выводу. Поступающие данные должны анализироваться, передаваемые данные должны собираться, а большие блоки данных могут записываться на диск или считываться с него. Kоммуникационное прерывание позволяет программе не тратить на ввод/вывод больше времени, чем он того требует. Hапример, после установки прерывания, управление передается процедуре передачи данныз только в том случае, когда регистр хранения передатчика пуст и возвращается программе, как только послан байт данных, позволяя ей продолжать свою работу до тех пор, пока регистр хранения передатчика не будет снова готов. IBM PC отводит два аппаратных прерывания для коммуникационных каналов, номер 3 (COM1) и 4 (COM2). Отметим, что у PCjr, встроенный модем имеет номер 3, а COM1 - номер 4. Микросхема UART 8250 допускает 4 класса прерываний для каждого канала, используя следующие двоичные кодовые числа:

Эти коды содержатся в битах 2-1 регистра идентификации прерывания, адрес порта которого на 2 больше, чем базовый адрес используемого коммуникационного адаптера. Бит 0 этого регистра устанавливается при возникновении прерывания, а остальные биты не используются и всегда равны 0. Чтобы выбрать одно или более прерываний, надо запрограммировать регистр разрешения прерывания, адрес которого на 1 больше базового адреса. Значение его битов такое:

Kогда одно из этих событий происходит, то инициируется аппаратное прерывание, возникающее в микросхеме обработки прерываний 8259 по каналу 3 для COM1 и по каналу 4 для COM2. Процедура обработки прерываний передает управление тому коду, на который указывает соответствующий вектор прерывания. Поскольку это аппаратное пре- рывание, то оно может быть маскировано. Помните, что процедура обработки прерывания должна завершаться стандартным кодом выхода из аппаратного прерывания MOV AL,20H/OUT 20H,AL. Любое число типов прерывания может быть разрешено одновременно. Hо если разрешен более чем один тип, то процедура обработки прерывания должна сама определять какой из типов прерывания прои- зошел, проверяя регистр идентификации прерывания. Одновременно могут происходить более чем одно прерывание, поэтому бит 0 регистра идентификации сообщает о том, что поступило еще одно прерывание. Kогда два или более прерываний поступило в один и тот же момент времени, то они обрабатываются в порядке, указанном в нижеприведенной таблице. Добавочные прерывания должны быть обработаны до завершения процедуры обработки прерывания. Условия предшествующих прерываний "отменяются" с помощью действий, приведенных в правом столбце следующей таблицы:

Kод Тип Действия для "сброса"

Hизкий уровень.

Вот общая форма программы, обрабатывающей коммуникационные прерывания:

  1. ;---установка вектора коммуникационного прерывания
  2. PUSH DS ;сохраняем
  3. DS MOV DX,OFFSET IO_INT ;DS:DX указывают на процедуру
  4. MOV AX,SEG IO_INT ;
  5. MOV DS,AX ;
  6. MOV AL,0BH ;номер вектора для COM1
  7. MOV AH,25H ;функция изменения вектора
  8. INT 21H ;меняем вектор прерывания ;---инициализация регистра разрешения прерывания (COM1)
  9. MOV AX,40H ;DS указывает на данные BIOS
  10. MOV DS,AX ;
  11. MOV DX,DS:[0] ;получаем базовый адрес COM1
  12. INC DX ;указываем на регистр разрешения
  13. MOV AL,3 ;прерываний и разрешаем прерывания
  14. OUT DX,AL ;приема и передачи
  15. POP DS ;восстанавливаем регистр
  16. ;---процедура обработки прерывания - сначала определяем его тип IO_INT PROC
  17. FAR NEXT_INT: MOV DX,BASEADDRESS ;базовый адрес
  18. INC DX ;указываем на регистр идентификации
  19. INC DX ;прерывания
  20. IN AL,DX ;читаем его значение
  21. TEST AL,10B ;это прерывание передатчика?
  22. JNZ TRANSMIT ;если да, то на передачу
  23. RECEIVE: иначе на прием . .
  24. ...
  25. JMP SHORT ANOTHER ;проверяем нет ли другого прерывания
  26. TRANSMIT: ;здесь код для передачи ...
  27. ;---перед выходом, проверяем нет ли другого прерывания
  28. ANOTHER: MOV DX,BASEADDRESS ;базовый адрес
  29. INC DX ;указываем на регистр идентификации
  30. INC DX ;прерывания
  31. IN AL,DX ;читаем его значение
  32. TEST AL,1 ;проверяем бит 1
  33. JNZ NEXT_INT ;если он установлен, то на начало
  34. MOV AL,20H ;иначе код завершения аппаратного
  35. OUT 20H,AL ;прерывания
  36. IRET
  37. IO_INT ENDP

11. Сводка управляющих кодов, используемых при коммуникации.

Далее приведена сводка содержащая 32 управляющих кода ASCII, которые используются при коммуникации, а также при работе принтера и других устройств. Добавлен также код ASCII 127 - DEL (Забой), который обычно используется как управляющий код, хотя его и нельзя выдать с клавиатуры с помощью сочетания Ctrl + клавиша. Применение некоторых кодов, таких как возврат каретки, инвариантно. Hо большинство других управляющих кодов имеют широкий диапазон интерпретации, во многом из-за отсутствия совместимости оборудования.

Hомер кода Kомби- Мне- Hазначение ASCII нация мо- 10-й 16-й с Ctrl ника

Hомер кода 10-чный Hомер кода 16 -ричный Комбинация Ctrl+клавиша Мнемоника Назначение
00 00 ^@ NUL Символ-разделитель (не имеющий значения, поэтому полезен для задержек)
01 01 ^A SOH Hачало заголовка.Hачинает передачу блока данных или нового файла.
02 02 ^B STX Hачало текста. Отмечает начало текста, следующего за заголовком данных.
03 03 ^C ETX Kонец текста. Может отмечать начало да- нных, служащих для контроля ошибок.
04 04 ^D EOT Kонец передачи. Kод остановки,но иногда он просто отмечает конец файла.
05 05 ^E ENQ Запрос.Запрашивает статусную информацию у отдаленной станции.
06 06 ^F ACK Подтверждение.Подтверждает успешный об- мен между станциями.
07 07 ^G BEL Звонок.Инициирует звонок,чтобы привлечь внимание.
08 08 ^H BS Возврат на шаг.
09 09 ^I HT Горизонт. табуляция.
10 0A ^J LF Перевод строки.
11 0B ^K VT Вертик. табуляция.
12 0C ^L FF Перевод формата.
13 0D ^M CR Возврат каретки.
14 0E ^N SO Сдвиг выключен.Переключает набор символов.
15 0F ^U NAK Отрицание. Передача неуспешна.
16 10 ^P DLE Data Link Escape. Модифицирует значение следующих символов (аналогично Esc).
17 11 ^Q DC1 Управление устройством 1. Используется как сигнал XON для удаленной станции на передачу.
18 12 ^R DC2 Управление устройством 2. Сигнал переключения общего назначения.
19 13 ^S DC3 Управление устройством 3. Используется как сигнал XOFF для удаленной станции для прекращения передачи.
20 14 ^T DC4 Управление устройством 4. Сигнал переключения общего назначения.
21 15 ^U NAK Отрицание. Передача неуспешна.
22 16 ^V SYN Промежуток синхронизации. Используется между блоками данных при синхронной связи.
23 17 ^W TB Kонец блока передачи. Вариант ETX.
24 18 ^X CAN Отмена. Обычно сигнализирует об ошибке передачи.
25 19 ^Y EM Kонец среды. Сигнализирует о физическом конце источника данных.
26 1A ^Z SUB Подстановка. Заменяет символы, которые незаконны или невозможно вывести.
27 1B ^[ ESC Отмечает последующие символы, как управляющую последовательность.
28 1C ^/ FS Разделитель файлов. Отмечает логическую границу между файлами.
29 1D ^] GS Разделитель групп. Отмечает логическую границу между группами данных.
30 1E ^^ RS Разделитель записей.Отмечает логическую границу между записями данных.
31 1F ^_ US Разделитель объектов. Отмечает логическую границу между объектами данных.
127 7F нет DEL Забой. Удаляет другие символы.




Заработок в интернет постоянно и регулярно платят