Программирование com порта ассемблера

Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод — Инициализация последовательного порта

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

Бейсик открывает коммуникационный канал как файл, и как тако-
вому ему должен быть присвоен идентификационный номер:

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

Скорость обмена дается как целое число: 75, 100, 150, 300, 600,
1200, 1800, 2400, 4800 или 9600 бод. По умолча-
нию берется скорость обмена 300 бод.
Четность вводится как односимвольный код: O для нечетной
E — для четной и N — при отсутствии контроля по
четности. Могут быть также S — когда бит чет-
ности всегда равен 0 и M — когда бит четности
всегда равен 1. Если используются 8 бит данных,
то надо указывать N; при использовании четырех
бит не надо использовать N. По умолчанию — E.
Биты данных дается как целое число 4, 5, 6, 7 или 8. По
умолчанию берется 7.
Стоп-биты дается как целое число 1 или 2, причем 2 —
значение по умолчанию для 75 и 110 бод, а 1 —
для остальных. Когда число битов данных равно 4
или 5, то 2 обозначает 1 1/2 стоп-бита. Такое
значение возможно при коммуникации, так как в
этом случае бит является единицей времени и
поэтому делим.

Читайте также:  Характерные особенности языков программирования

Оператор OPEN «COM1:» AS #1 открывает COM1 для связи со скоростью
300 бод с четной четностью, используя 7 битов данных и 1
стоп-бит. OPEN «COM1:1200,O,8,1» устанавливает скорость 1200 бод,
нечетную четность, 8 бит на символ и 1 стоп-бит. Отметим, что Вы
можете завершить оператор OPEN выражением LEN = число, где число
устанавливает максимальный размер блока, с которым операторы GET
и PUT могут обрабатывать данные (по умолчанию 128 байтов). Имеет-
ся также ряд команд управления модемом, которые также могут быть
включены в эту спецификацию. (В [7.1.5] объясняется специальная
терминология, используемая при этом):

RS Подавляет сигнал «Запрос на посылку» (Request to send).
Если эта команда опущена, то OPEN «COM» включает RTS.

CS Вызывает проверку линии «Очистка посылки» (Clear to
send). За этой командой может следовать значение (от 0
до 65535), дающее число миллисекунд которые будет ожи-
даться сигнал перед тем как будет выдана ошибка таймау-
та, например, 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 ;инициализируем порт

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

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

Источник

Программирование COM портов

Старший байт делителя записывается в порт 3F9h. Зависимост скорости передачи данных от значе- ния делителя частоты приведины в таблице 1:

Делитель Скорость передчи в бодах. Делитель Скорость передчи в бодах.
1040 110 24 4800
768 150 12 9600
384 300 6 19200
192 600 3 38400
96 1200 2 57600
48 2400 1 115200

Порт используется как регистр управления прерываниями от асинхронного адаптера или (после вывода в порт 3F9h байта с установленым в 1 стар- шим битом) для вывода значения старшего байта делителя частоты такто- вого генератора. В режиме регистра управления прерываниями порт имеет следующий формат.

Бит Значение
0 1 — разрешемие прерывания при готовности принимаемых данных.
1 1 — разрешение прерывания после передачи байта (когда выхо — дной выходной буфер передачи пуст.)
2 1 — разрешение прерывания по обнаружении состояния «BREAK» или ошибки.
3 1 — разрешение прерывания по изменению на разъёме RS-232-C.
4-7 Не используются, должны быть равны 0.

Регистр идентификации прерывания. По его содержимому программа может определить причину прерывания. Формат регистра приведён в таблице 3.

  • 01 — данные приняты и доступны для чтения. Сбрасывается после после чтения данных из порта 3F8h.
  • 11 — Состояние модема. Устонавливается при изменении состояния входных линий CTS, RI, DCD, DSR.

Управляющий регистр, доступен по записи и чтению. Его формат показан в таблице 4.

  • 01 — 6 бит.
  • 10 — 7 бит.
  • 11 — 8 бит.
  • 10 — контроль на чётность неиспользуется;
  • 01 — контроль на нечётность.
  • 11 — контроль на чётность.

Регитр управления модемом. Упровляет состоянием выходных линий DTR, RTS, линий, специфических для модемов OUT1 и OUT2, для запуска диагно- стики при входе асинхронного адаптера, замкнутым на его выход. Формат порта приведён в таблице 5.

Бит Значение
0 Линия DTR
1 Линия RTS.
2 Линия OUT1 (запасная)
3 Линия OUT2 (запасная)
4 Запуск диагностики при входе асинхронного|
адаптера, замкнутом на его выход.
5-7 Должно быть равно 0

Порт 3FDh.
Регистр состоянии линии. Значение зарядов регистра приведены в
таблице 6.

Бит Значение
0 Данные получены и готовы для чтения, сбрасываетсь при чтении данных.
1 Ошибка переполнения. Был принят новый байт данных, а предыдущий ещё не был считан программой. Предыдущий байт потерен.
2 Ошибка чётности, сбрасывается после чтения состояния линии.
3 Ошибка синхронизации.
4 Обнаружен запрос на прерывание передачи «BREAK» — длинная строка нулей.
5 Регистр хранения передатчика пуст, в него можно записать новый байт для передачи.
6 Регистр сдвига передатчика пуст. Этот регистр получает данные из регистра хранения и преобразует их в последовательный вид для передачи.
7 Тайм-аут (устройство не связано с компьютером)

Регистр состояния модема. Значения битов указвны в таблице 7.

Бит Значение
0 Линия CTS изменила состояние.
1 Линия DSR изменила состояние.
2 Линия IR изменила состояние.
3 Линия DCD изменила состояние.
4 Состояние линии CTS
5 Состояние линии DSR
6 Состояние линии IR.
7 Состояние линии DCD.

Перед записью байта данных в регистр передатчика нужно убедиться, что регистр хранения передатчика свободен, то есть убедиться в том, что передача предыдущего символа завершена. Признаком свободы регистра передатчика является установленный в 1 бит 5 регистра состояния линии с адресом 3FDh.

Аналогично передачи данных перед вводом символа из порта приёмника 3F8h следует убедиться, что бит 0 порта 3FDh установлен в 1, то есть что символ принят из линии и находиться в вуферном регистре приёмника.

Источник

проинициализировать СОМ-порт и считать с его данные

Не судите строго, я только начинаю.
При создании obj-файла ошибок нет, а вот при линковании выдает
Fatal: 32-bit record encountered in module COM.ASM
Я хочу проинициализировать СОМ-порт и считать с его данные, а не получается.
вот код собственно. Делаю все в тасме. Скажите что не так.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
.386p .model flat, stdcall .data? Data_Byte db ? .code start: Init_COM1 proc mov AL, 80h ;устанавливаем бит 7 в 1 out DX, AL ;Регистр управления линией ;Скорость 9600 mov DX, 3F8h;Порт для установки младшего байта делителя mov AL, 00h ;Младший байт делителя out DX, AL ;Записывам данные в порт mov AL, 0Ch ;Старший байт делителя mov DX, 3F9h;Порт для установки старшего байта делителя out DX, AL ;Записывам данные в порт ;Настраиваем регистр управления линией 3FBh mov DX, 3FBh;Порт управления линией mov AL, 00000011b; 8 бит,1 стоп, без четности out DX, AL ;Записывам данные в порт ;Настраиваем регистр управления модемом 3FCh mov DX, 3FCh;Порт управления линией mov AL, 00001011b; DTR,RTS,OUT1,OUT2 out DX, AL ;Записывам данные в порт ;Настраиваем регистр управления прерываниями 3F9h mov DX, 3F9h mov AL, 0 ; out DX, AL ; ret Init_COM1 endp ;Процедура для чтения байта данных из порта СОМ1 ReadByte_COM proc mov DX, 3F8h; порт данных in Al, DX ;читаем байт из порта mov Data_Byte, AL ; Копируем байт данных ret ReadByte_COM endp end start

Источник

Работа с Com портом

Помогите, пожалуйста, составить программу. Задание такое: «Написать 16–ти разрядную ассемблерную программу, которая выводит на экран консоли сообщение о том, установлен или нет порт СОМ2 и в случае установки выводит также его базовый адрес в 16-тиричном виде.»
Вот, что нашел

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

бит 0 1 = байт данных получен
1 1 = полученные данные были перезаписаны (предыдущий
символ не был вовремя считан)
2 1 = ошибка четности (вероятно, из-за шума в линии)
3 1 = ошибка окружения (передача не синхронизована)
4 1 = обнаружен перерыв (получена длинная строка единиц,
индицирующая, что другая станция запрашивает
конец передачи)
5 1 = регистр хранения передатчика пуст (в этот регистр
должны помещаться передаваемые данные)
6 1 = регистр сдвига передатчика пуст (этот регистр по-
лучает данные из регистра хранения и преобразует
их в последовательный вид)
7 1 = таймаут (устройство не связано с машиной)

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

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 ;если да, то на обработку перерыва
;---обмен базовых адресов для 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 ;

Источник

Оцените статью