Как настроить опрос COM-порта по прерыванию int 14h? - C (СИ)
Формулировка задачи:
Мне нужно инициализировать сом порт и затем по прерыванию int 14h считывать данные из ком порта. Инициализацию на с++ сделал по простому (компилятор Турбо С, MS-DOS) (только пока настроена только инициализация и очищение фифо буфера для приема данных и вот есть код на ассемблере с этим прерыванием как настроить код на с++ по прерыванию int14h? (просто чтение данных из порта, передавать ничего не нужно)
#include <stdio.h>
#include <dos.h>
int main(void)
{
unsigned char result;
int port = 0x3F8; /* serial port 1 */
result = inportb(port);
printf("baza+0 stenie dannyx %c\n",result);
outportb(port+3,0x80); /*set dlab on*/
outportb(port+1,0x00); /*starschiy bait scorosti*/
outportb(port+0,0x0C); /*scorosti mlads bait 9600*/
outportb(port+3,0x03);/* set dlab off,8bit,no perity,1 stop bit */
outportb(port+1,0x01); /*preryvanie po priemu*/
inportb(port+3); /*zadergka ignorirovan*/
outportb(port+2,0xC7); /*FIFO registr */
outportb(port+4,0x0b); /*DTR,RTS,OUT2*/
inportb(port+0); /*obnulenie bufera*/
return 0;
}.MODEL tiny
.DATA
.CODE
.386
org 100h
START:
for_loop:
mov dx,0
mov ah,3
int 14h
mov dx,3FCh
bt ax,4
jb @3
@2:
mov al,00001001b
jmp @4
@3:
mov al,00001011b
@4:
out dx,al
jmp for_loop
mov ah,4ch
int 21h
END STARTРешение задачи: «Как настроить опрос COM-порта по прерыванию int 14h?»
textual
Листинг программы
#include <stdio.h>
#include <dos.h>
int main(void)
{
unsigned char result;
int port = 0x3F8; /* СCOM1 */
int flag=0;
printf("Инициализация порта\n");
outportb(port+3,0x80); /*Установка dlab on*/
outportb(port+1,0x00); /*старший байт скорости порта*/
outportb(port+0,0x0C); /*младший байт скорости 9600*/
outportb(port+3,0x03);/* установка режимов работы set dlab off,8bit,no perity,1 stop bit */
outportb(port+1,0x01); /*настраиваем прерывание по приему данных*/
inportb(port+3); /*задержку игнорируем*/
outportb(port+2,0xC7); /*включаем FIFO регистр*/
outportb(port+4,0x0b); /*DTR,RTS,OUT2*/
inportb(port+0); /*обнуления буфера без сохранения*/
while (flag==0) /*включаем прерывание по поcтуплению данных в буфер*/
{
result = inportb(port+2);
if (result>195) /*Проверяем 4й бит регистра IIR (baza+2)*/
{
result = inportb(port); /*если в буфере появился символ считываем его и выводим на экран*/
printf("%c",result);
}
/*и ждем поступлен ие следующего символа в буфере*/
} /*while*/
/*getch();*/
return 0;
} /*main*/