Порт последовательной передачи данных (COM порт)
Добавлено: Пн янв 06, 2025 10:25 pm
Hello, world!
Эта статья будет посвящена порту последовательной передачи данных (COM порту), его ещё называют портом RS-232 или асинхронным адаптером.
До сих пор COM порт используется многими устройствами на производствах, в быту и в офисах, даже на самых новых материнских платах есть контакты для подключения разъёма.
"Последовательная передача данных" означает, что данные передаются последовательно, байт за байтом по одной линии (проводу), а для синхронизации битов всегда есть "стартовый" бит, "стоповый" бит, бит проверки на чётность и один или два бита стоповых бита, бит проверки на чётность может отсутствовать. Написанное иллюстрируется следующей картинкой:
Из рисунка видно, что исходное состояние линии передачи данных это ВЫСОКИЙ уровень сигнала (логическая 1), "стартовый" бит сигнализирует о начале передачи данных, за ним следуют 8 бит данных, передаются сначала младшие, затем старшие биты. Если контроллер COM порта имеет такую конфигурацию, что передается и бит чётности, то передаётся и он. Бит чётности имеет такое значение, чтобы количество логических единиц (или нулей) было чётным. В конце передаётся один или два "стоповых" бита, которые имеют ВЫСОКИЙ уровень сигнала (логическая 1) и возвращают линию передачи данных в исходное состояние.
Чётность, количество битов, количество "стоповых" битов определяют протокол передачи данных. Очевидно, что приёмник и передатчик должны использовать одинаковый протокол для корректной работы.
Ещё одна характеристика это скорость, она также должна быть одинаковой для приёмника и передатчика. Скорость передачи данных измеряется в бодах (bauds). Боды - переданное количество битов в секунду, при этом учитываются и служебные биты (бит чётности, "стартовый" бит, "стоповый" бит). Иногда используется термин бит/с (bps) - эффективная скорость передачи данных без учета служебных битов.
Компьютер может быть оснащён разным количеством портов последовательной передачи данных, могут использоваться платы расширения, но принцип работы от этого не меняется, я буду использовать в своих программах порт COM1.
Чаще всего устройства подключают к последовательному порту с помощью разъёма DB9P, он имеет 9 контактов, вот распиновка разъема:
Также иногда используется кабель с двумя разными разъёмами на концах, с одной стороны DB9P, а с другой DB25P, например, в принтере EPSON LX 300 последовательный интерфейс можно перепутать с параллельным интерфейсом, так как используется тот же разъём DB25P, распиновка для разъёма DB25P, использующемся для последовательной передачи данных такая:
На этапе инициализации модуль BIOS тестирует имеющиеся асинхронные адаптеры и первые два. Их базовые адреса расположены в области данных BIOS начиная с адреса 0000:0400h.
Первый адаптер COM1 имеет базовый адрес 3F8h и занимает диапазон адресов от 3F8h до 3FFh.
Второй адаптер COM2 имеет базовый адрес 2F8h и занимает адреса 2F8h...2FFh.
Асинхронные адаптеры могут вырабатывать прерывания:
COM1 - IRQ4 (INT 0Ch)
COM2 - IRQ3 (INT 0Bh)
Рассмотрим значения отдельных битов этих портов:
Порт 3F8h
Этот порт соответствует регистру передаваемых данных, в него записывается байт для передачи, либо из него может быть прочитан принятый от другого устройства байт.
Значение порта может меняться, в зависимости от значения старшего бита записанного в порт 3FBh, если этот бит равен 0, то порт используется для записи передаваемых данных, а если равен единице, то используется для установки скорости передачи данных. Для изменения скорости передачи данных необходимо установить старший бит в порте 3FBh в 1, затем записать значение младшего байта делителя частоты в порт 3F8h, а значение старшего байта в порт 3F9h.
Зависимость скорости передачи данных от значения делителя частоты:
1040d--->110 бод
768d---->150 бод
384d---->300 бод
192d---->600 бод
96d----->1200 бод
48d----->2400 бод
24d----->4800 бод
12d----->9600 бод
6d------>19200 бод
3d------>38400 бод
2d------>57600 бод
1d------>115200 бод
Порт 3F9h
Порт используется как регистр управления прерываниями от асинхронного адаптера, либо для записи значения старшего байта делителя частоты (после вывода в порт 3FBh байта с установленным в 1 старшим битом).
В режиме регистра управления прерываниями, биты имеют следующее значение:
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦--------¦ ¦ ¦ ¦
LT+-+-+T+T+T+T+T-
L==T==-¦ ¦ ¦ | L= 1 - разрешение прерывания при готовности принимаемых данных;
....¦----¦ ¦ ¦
....¦----¦ ¦ ¦
....¦----¦ ¦ L=== 1 - разрешение прерывания после передачи байта (когда выходной буфер передачи пуст);
....¦----¦ ¦
....¦----¦ ¦
....¦----¦ ¦
....¦----¦ L===== 1 - разрешение прерывания по обнаружению состояния "BREAK" или по ошибке;
....¦----¦
....¦----|
....¦----L======= 1 - разрешение прерывания по изменению состояния входных линий на разъеме
....¦.................RS-232-C (CTS, DSR, RI, DCD);
....¦
....¦
L============ Не используются, должны быть равны 0.
Порт 3FAh
Регистр идентификации прерывания. Считывая его содержимое, программа может определить причину прерывания.
Аппаратное обеспечение IBM PC
© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.
[Назад] [Содеожание] [Дальше]
6.3. Порты асинхронного адаптера
На этапе инициализации системы модуль POST BIOS тестирует имеющиеся асинхронные адаптеры и инициализирует первые два. Их базовые адреса располагаются в области данных BIOS начиная с адреса 0000:0400h.
Первый адаптер COM1 имеет базовый адрес 3F8h и занимает диапазон адресов от 3F8h до 3FFh. Второй адаптер COM2 имеет базовый адрес 2F8h и занимает адреса 2F8h...2FFh.
Асинхронные адаптеры могут вырабатывать прерывания:
COM1 - IRQ4 (соответствует INT 0Ch)
COM2 - IRQ3 (соответствует INT 0Bh)
Рассмотрим назначение отдельных битов этих портов.
Порт 3FBh
Управляющий регистр, доступен для записи и чтения.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
.¦ ¦ ¦ L=¦ ¦ L=¦= Длина слова в битах:
.¦ ¦ ¦ ¦ ¦........00 - 5 бит;
.¦ ¦ ¦ ¦ ¦........01 - 6 бит;
.¦ ¦ ¦ ¦ ¦........10 - 7 бит;
.¦ ¦ ¦ ¦ ¦........11 - 8 бит.
.¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ L===== Количество стоповых бит:
.¦ ¦ ¦ ¦..........0 - 1 бит;
.¦ ¦ ¦ ¦..........1 - 2 бита.
.¦ ¦ ¦ ¦
.¦ ¦ ¦ L======= Четность:
.¦ ¦ ¦..............X0 - контроль на четность не
.¦ ¦ ¦...................используется;
.¦ ¦ ¦..............01 - контроль на нечетность;
.¦ ¦ ¦..............11 - контроль на четность.
.¦ ¦ ¦
.¦ ¦ L=========== Фиксация четности. При установке этого
.¦ ¦..............бита бит четности всегда принимает
.¦ ¦..............значение 0 (если биты 3-4 равны 11) или 1
.¦ ¦..............(если биты 3-4 равны 01).
.¦ ¦
.¦ L============= Установка перерыва. Вызывает вывод
.¦................строки нулей в качестве сигнала
.¦................"BREAK" для подключенного устройства.
.¦
.L=============== 1 - порты 3F8h и 3F9h используются
..................для для загрузки делителя частоты
..................тактового генератора;
..................0 - порты используются как обычно.
Порт 3FCh
Регистр управления модемом.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+-+T+T+T+T+T+T-
L=T=-----¦ ¦ ¦ L= линия DTR;
---¦---¦ ¦ ¦ ¦
---¦---¦ ¦ ¦ L=== линия RTS;
---¦---¦ ¦ ¦
---¦---¦ ¦ L===== линия OUT1 (запасная);
---¦---¦ ¦
---¦---¦ L======= линия OUT2 (запасная);
---¦---¦
---¦---L========= запуск диагностики при входе
---¦------------- асинхронного адаптера, замкнутом
---¦------------- на его выход;
---¦
---L============= должно быть равно 0.
Порт 3FDh
Регистр состояния линии.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
-¦ ¦ ¦ ¦ ¦ ¦ ¦ L= Данные получены и готовы для чтения,
-¦ ¦ ¦ ¦ ¦ ¦ ¦=== сбрасывается при чтении данных.
-¦ ¦ ¦ ¦ ¦ ¦ ¦
-¦ ¦ ¦ ¦ ¦ ¦ L=== Ошибка переполнения. Был принят новый
-¦ ¦ ¦ ¦ ¦ ¦===== байт данных, а предыдущий еще не был
-¦ ¦ ¦ ¦ ¦ ¦===== считан программой. Предыдущий байт
-¦ ¦ ¦ ¦ ¦ ¦===== потерян.
-¦ ¦ ¦ ¦ ¦ ¦
-¦ ¦ ¦ ¦ ¦ L===== Ошибка четности, сбрасывается после
-¦ ¦ ¦ ¦ ¦======= чтения состояния линии.
-¦ ¦ ¦ ¦ ¦
-¦ ¦ ¦ ¦ L======= Ошибка синхронизации.
-¦ ¦ ¦ ¦
-¦ ¦ ¦ L========= Обнаружен запрос на прерывание
-¦ ¦ ¦=========== передачи "BREAK" - длинная строка нулей.
-¦ ¦ ¦
-¦ ¦ L=========== Регистр хранения передатчика пуст, в него
-¦ ¦============= можно записывать новый байт для передачи.
-¦ ¦
-¦ L============= Регистр сдвига передатчика пуст. Этот
-¦=============== регистр получает данные из регистра
-¦=============== хранения и преобразует их в
-¦=============== последовательный вид для передачи.
-¦
-L=============== Таймаут (устройство не связано с
компьютером).
Порт 3FEh
Регистр состояния модема.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
.¦ ¦ ¦ ¦ ¦ ¦ ¦ L= линия CTS изменила состояние
.¦ ¦ ¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ ¦ ¦ L=== линия DSR изменила состояние
.¦ ¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ ¦ L===== линия RI изменила состояние
.¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ L======= линия DCD изменила состояние
.¦ ¦ ¦ ¦
.¦ ¦ ¦ L========= состояние линии CTS
.¦ ¦ ¦
¦ ¦ L=========== состояние линии DSR
¦ ¦
¦ L============= состояние линии RI
¦
L=============== состояние линии DCD
Также BIOS поддерживает передачу и приём данных с асинхронного адаптера, но это мы рассматривать не будем, скажу лишь, что это прерывание INT 14h.
Перед использованием асинхронный адаптер необходимо инициализировать (установить нужную конфигурацию), при загрузке ОС изначально COM порт работает со скоростью 2400 бод, не выполняется проверка на чётность, используется 1 стоповый бит и 8 бит данных.
Перейдём к программированию асинхронного адаптера, напишем программу, которая обменивается сообщениями с терминалом:
Для подключения я использовал PUTTY и VMWare, вы можете использовать любой другой компьютер с DOS.
Была использована версия компилятора MASM 6.11 в контексте операционной системы MS DOS 6.22!
Спасибо за внимание!
С уважением, push0ret!
Эта статья будет посвящена порту последовательной передачи данных (COM порту), его ещё называют портом RS-232 или асинхронным адаптером.
До сих пор COM порт используется многими устройствами на производствах, в быту и в офисах, даже на самых новых материнских платах есть контакты для подключения разъёма.
"Последовательная передача данных" означает, что данные передаются последовательно, байт за байтом по одной линии (проводу), а для синхронизации битов всегда есть "стартовый" бит, "стоповый" бит, бит проверки на чётность и один или два бита стоповых бита, бит проверки на чётность может отсутствовать. Написанное иллюстрируется следующей картинкой:
Из рисунка видно, что исходное состояние линии передачи данных это ВЫСОКИЙ уровень сигнала (логическая 1), "стартовый" бит сигнализирует о начале передачи данных, за ним следуют 8 бит данных, передаются сначала младшие, затем старшие биты. Если контроллер COM порта имеет такую конфигурацию, что передается и бит чётности, то передаётся и он. Бит чётности имеет такое значение, чтобы количество логических единиц (или нулей) было чётным. В конце передаётся один или два "стоповых" бита, которые имеют ВЫСОКИЙ уровень сигнала (логическая 1) и возвращают линию передачи данных в исходное состояние.
Чётность, количество битов, количество "стоповых" битов определяют протокол передачи данных. Очевидно, что приёмник и передатчик должны использовать одинаковый протокол для корректной работы.
Ещё одна характеристика это скорость, она также должна быть одинаковой для приёмника и передатчика. Скорость передачи данных измеряется в бодах (bauds). Боды - переданное количество битов в секунду, при этом учитываются и служебные биты (бит чётности, "стартовый" бит, "стоповый" бит). Иногда используется термин бит/с (bps) - эффективная скорость передачи данных без учета служебных битов.
Компьютер может быть оснащён разным количеством портов последовательной передачи данных, могут использоваться платы расширения, но принцип работы от этого не меняется, я буду использовать в своих программах порт COM1.
Чаще всего устройства подключают к последовательному порту с помощью разъёма DB9P, он имеет 9 контактов, вот распиновка разъема:
- 1 Детектор принимаемого Вход
с линии сигнала
(Data Carrier Detect,
DCD)
2 Принимаемые данные Вход
(Received Data)
3 Передаваемые данные Выход
(Transmitted Data)
4 Готовность выходных Выход
данных
(Data Terminal Ready,
DTR)
5 Сигнальное заземление -
6 Готовность данных Вход
(Data Set Ready, DSR)
7 Запрос для передачи Выход
(Request to send, RTS)
8 Сброс для передачи Вход
(Clear to Send, CTS)
9 Индикатор вызова Вход
(Ring Indicator, RI)
Также иногда используется кабель с двумя разными разъёмами на концах, с одной стороны DB9P, а с другой DB25P, например, в принтере EPSON LX 300 последовательный интерфейс можно перепутать с параллельным интерфейсом, так как используется тот же разъём DB25P, распиновка для разъёма DB25P, использующемся для последовательной передачи данных такая:
- 1 Защитное заземление -
2 Передаваемые данные Выход
(Transmitted Data)
3 Принимаемые данные Вход
(Received Data)
4 Запрос для передачи Выход
(Request to send, RTS)
5 Сброс для передачи Вход
(Clear to Send, CTS)
6 Готовность данных Вход
(Data Set Ready, DSR)
7 Сигнальное заземление -
8 Детектор принимаемого Вход
с линии сигнала
(Data Carrier Detect,
DCD)
9-19 Не используются
20 Готовность выходных Выход
данных
(Data Terminal Ready,
DTR)
21 Не используется
22 Индикатор вызова Вход
(Ring Indicator, RI)
23-25 Не используется
На этапе инициализации модуль BIOS тестирует имеющиеся асинхронные адаптеры и первые два. Их базовые адреса расположены в области данных BIOS начиная с адреса 0000:0400h.
Первый адаптер COM1 имеет базовый адрес 3F8h и занимает диапазон адресов от 3F8h до 3FFh.
Второй адаптер COM2 имеет базовый адрес 2F8h и занимает адреса 2F8h...2FFh.
Асинхронные адаптеры могут вырабатывать прерывания:
COM1 - IRQ4 (INT 0Ch)
COM2 - IRQ3 (INT 0Bh)
Рассмотрим значения отдельных битов этих портов:
Порт 3F8h
Этот порт соответствует регистру передаваемых данных, в него записывается байт для передачи, либо из него может быть прочитан принятый от другого устройства байт.
Значение порта может меняться, в зависимости от значения старшего бита записанного в порт 3FBh, если этот бит равен 0, то порт используется для записи передаваемых данных, а если равен единице, то используется для установки скорости передачи данных. Для изменения скорости передачи данных необходимо установить старший бит в порте 3FBh в 1, затем записать значение младшего байта делителя частоты в порт 3F8h, а значение старшего байта в порт 3F9h.
Зависимость скорости передачи данных от значения делителя частоты:
1040d--->110 бод
768d---->150 бод
384d---->300 бод
192d---->600 бод
96d----->1200 бод
48d----->2400 бод
24d----->4800 бод
12d----->9600 бод
6d------>19200 бод
3d------>38400 бод
2d------>57600 бод
1d------>115200 бод
Порт 3F9h
Порт используется как регистр управления прерываниями от асинхронного адаптера, либо для записи значения старшего байта делителя частоты (после вывода в порт 3FBh байта с установленным в 1 старшим битом).
В режиме регистра управления прерываниями, биты имеют следующее значение:
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦--------¦ ¦ ¦ ¦
LT+-+-+T+T+T+T+T-
L==T==-¦ ¦ ¦ | L= 1 - разрешение прерывания при готовности принимаемых данных;
....¦----¦ ¦ ¦
....¦----¦ ¦ ¦
....¦----¦ ¦ L=== 1 - разрешение прерывания после передачи байта (когда выходной буфер передачи пуст);
....¦----¦ ¦
....¦----¦ ¦
....¦----¦ ¦
....¦----¦ L===== 1 - разрешение прерывания по обнаружению состояния "BREAK" или по ошибке;
....¦----¦
....¦----|
....¦----L======= 1 - разрешение прерывания по изменению состояния входных линий на разъеме
....¦.................RS-232-C (CTS, DSR, RI, DCD);
....¦
....¦
L============ Не используются, должны быть равны 0.
Порт 3FAh
Регистр идентификации прерывания. Считывая его содержимое, программа может определить причину прерывания.
Аппаратное обеспечение IBM PC
© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.
[Назад] [Содеожание] [Дальше]
6.3. Порты асинхронного адаптера
На этапе инициализации системы модуль POST BIOS тестирует имеющиеся асинхронные адаптеры и инициализирует первые два. Их базовые адреса располагаются в области данных BIOS начиная с адреса 0000:0400h.
Первый адаптер COM1 имеет базовый адрес 3F8h и занимает диапазон адресов от 3F8h до 3FFh. Второй адаптер COM2 имеет базовый адрес 2F8h и занимает адреса 2F8h...2FFh.
Асинхронные адаптеры могут вырабатывать прерывания:
COM1 - IRQ4 (соответствует INT 0Ch)
COM2 - IRQ3 (соответствует INT 0Bh)
Рассмотрим назначение отдельных битов этих портов.
Порт 3FBh
Управляющий регистр, доступен для записи и чтения.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
.¦ ¦ ¦ L=¦ ¦ L=¦= Длина слова в битах:
.¦ ¦ ¦ ¦ ¦........00 - 5 бит;
.¦ ¦ ¦ ¦ ¦........01 - 6 бит;
.¦ ¦ ¦ ¦ ¦........10 - 7 бит;
.¦ ¦ ¦ ¦ ¦........11 - 8 бит.
.¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ L===== Количество стоповых бит:
.¦ ¦ ¦ ¦..........0 - 1 бит;
.¦ ¦ ¦ ¦..........1 - 2 бита.
.¦ ¦ ¦ ¦
.¦ ¦ ¦ L======= Четность:
.¦ ¦ ¦..............X0 - контроль на четность не
.¦ ¦ ¦...................используется;
.¦ ¦ ¦..............01 - контроль на нечетность;
.¦ ¦ ¦..............11 - контроль на четность.
.¦ ¦ ¦
.¦ ¦ L=========== Фиксация четности. При установке этого
.¦ ¦..............бита бит четности всегда принимает
.¦ ¦..............значение 0 (если биты 3-4 равны 11) или 1
.¦ ¦..............(если биты 3-4 равны 01).
.¦ ¦
.¦ L============= Установка перерыва. Вызывает вывод
.¦................строки нулей в качестве сигнала
.¦................"BREAK" для подключенного устройства.
.¦
.L=============== 1 - порты 3F8h и 3F9h используются
..................для для загрузки делителя частоты
..................тактового генератора;
..................0 - порты используются как обычно.
Порт 3FCh
Регистр управления модемом.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+-+T+T+T+T+T+T-
L=T=-----¦ ¦ ¦ L= линия DTR;
---¦---¦ ¦ ¦ ¦
---¦---¦ ¦ ¦ L=== линия RTS;
---¦---¦ ¦ ¦
---¦---¦ ¦ L===== линия OUT1 (запасная);
---¦---¦ ¦
---¦---¦ L======= линия OUT2 (запасная);
---¦---¦
---¦---L========= запуск диагностики при входе
---¦------------- асинхронного адаптера, замкнутом
---¦------------- на его выход;
---¦
---L============= должно быть равно 0.
Порт 3FDh
Регистр состояния линии.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
-¦ ¦ ¦ ¦ ¦ ¦ ¦ L= Данные получены и готовы для чтения,
-¦ ¦ ¦ ¦ ¦ ¦ ¦=== сбрасывается при чтении данных.
-¦ ¦ ¦ ¦ ¦ ¦ ¦
-¦ ¦ ¦ ¦ ¦ ¦ L=== Ошибка переполнения. Был принят новый
-¦ ¦ ¦ ¦ ¦ ¦===== байт данных, а предыдущий еще не был
-¦ ¦ ¦ ¦ ¦ ¦===== считан программой. Предыдущий байт
-¦ ¦ ¦ ¦ ¦ ¦===== потерян.
-¦ ¦ ¦ ¦ ¦ ¦
-¦ ¦ ¦ ¦ ¦ L===== Ошибка четности, сбрасывается после
-¦ ¦ ¦ ¦ ¦======= чтения состояния линии.
-¦ ¦ ¦ ¦ ¦
-¦ ¦ ¦ ¦ L======= Ошибка синхронизации.
-¦ ¦ ¦ ¦
-¦ ¦ ¦ L========= Обнаружен запрос на прерывание
-¦ ¦ ¦=========== передачи "BREAK" - длинная строка нулей.
-¦ ¦ ¦
-¦ ¦ L=========== Регистр хранения передатчика пуст, в него
-¦ ¦============= можно записывать новый байт для передачи.
-¦ ¦
-¦ L============= Регистр сдвига передатчика пуст. Этот
-¦=============== регистр получает данные из регистра
-¦=============== хранения и преобразует их в
-¦=============== последовательный вид для передачи.
-¦
-L=============== Таймаут (устройство не связано с
компьютером).
Порт 3FEh
Регистр состояния модема.
7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
.¦ ¦ ¦ ¦ ¦ ¦ ¦ L= линия CTS изменила состояние
.¦ ¦ ¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ ¦ ¦ L=== линия DSR изменила состояние
.¦ ¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ ¦ L===== линия RI изменила состояние
.¦ ¦ ¦ ¦ ¦
.¦ ¦ ¦ ¦ L======= линия DCD изменила состояние
.¦ ¦ ¦ ¦
.¦ ¦ ¦ L========= состояние линии CTS
.¦ ¦ ¦
¦ ¦ L=========== состояние линии DSR
¦ ¦
¦ L============= состояние линии RI
¦
L=============== состояние линии DCD
Также BIOS поддерживает передачу и приём данных с асинхронного адаптера, но это мы рассматривать не будем, скажу лишь, что это прерывание INT 14h.
Перед использованием асинхронный адаптер необходимо инициализировать (установить нужную конфигурацию), при загрузке ОС изначально COM порт работает со скоростью 2400 бод, не выполняется проверка на чётность, используется 1 стоповый бит и 8 бит данных.
Перейдём к программированию асинхронного адаптера, напишем программу, которая обменивается сообщениями с терминалом:
Код: Выделить всё
.model tiny
.286
code segment
org 100h
start:
;Initialize
;----------------------------------------------
mov dx,3FBh
in al, dx
and al, 10010011b ;set 8 bit, no parity control,
out dx, al ;1 stop bit and go set speed
mov dx, 3F8h
mov al, 6d ;set speed 19200 baud
out dx, al
;-----------------------------------------------
;Transmit bytes
;-----------------------------------------------
transmit:
mov ah, 1d
int 21h
cmp al, 'q'
jz listen
mov dx, 3F8h
out dx, al ;transmit byte
mov dx, 3FDh
wait_transmit:
in al, dx
test al, 00100000b ;control bit 5 in port 3FDh
jnz transmit
jmp wait_transmit
;------------------------------------------------
;Listen terminal
;------------------------------------------------
listen:
mov dx, 3FDh
in al, dx ;receive byte
test al, 00000001b ;control bit 1 in port 3FDh
jz listen
mov dx, 3F8h
in al, dx
cmp al, 'q'
jz exit
mov dl, al
mov ah, 2d
int 21h
jmp listen
;-------------------------------------------------
exit:
mov ax, 4c00h
int 21h
code ends
end start
Была использована версия компилятора MASM 6.11 в контексте операционной системы MS DOS 6.22!
Спасибо за внимание!
С уважением, push0ret!