A1exSun
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Исправил инициализацию порта: Код: void com_init(void) { // инициализация порта outportb(C.PortAddr+5,0x00); // сбрасываем регистр состояния линии outportb(C.PortAddr+6,0x00); // сбрасываем регистр состояния модема outportb(C.PortAddr,0x00); // сбрасываем регистр данных outportb(C.PortAddr+3,0x80); // устанавливаем управляющий регистр outportb(C.PortAddr,C.SpeedDiv & 0xFF); // скорость передачи данных (мл. байт) outportb(C.PortAddr+1,C.SpeedDiv >> 8); // скорость передачи данных (ст. байт) outportb(C.PortAddr+3,0x03); // устанавливаем управляющий регистр outportb(C.PortAddr+1,0x07); // устанавливаем регистр управления прерываниями outportb(C.PortAddr+2,0x00); // устанавливаем регистр управления режимом буферизации portoldvect = getvect(C.PortInt); } | Обработчик: Код: void interrupt far sender(void) { // передатчик char intr = inportb(C.PortAddr+2); enable(); if (intr & 6 == 0) { // прерывание по линии состояния } else if ((intr & 6 == 2) && (B.i != B.len)) { // буфер передатчика пуст outportb(C.PortAddr,B.data[B.i]); B.i++; } else if (intr & 6 == 4) { // данные приняты } outportb(0x20,0x20); // здесь? disable(); } | С основной программы: Код: com_init(); B.len = 27; while((inportb(C.PortAddr+5) & 0x20) == 0); B.i = 1; outportb(C.PortAddr,B.data[0]); getch(); cprintf(" %d %c\n",B.i,inportb(C.PortAddr)); // все равно выводит 1 (значит прерываний не было), а символа с порта уже нет | И теперь при каждой попытке передачи мигает индикатор порта, а раньше только первый раз после загрузки доса, дальше никакой реакции не было. Добавлено: Код: // Считываем состояние регистра маски прерываний mov dx,21h in dx,al // Разрешаем прерывания от порта COM1 and al,11101111b // Записываем новое значение в регистр маски прерываний out dx,al | А вот это я не делал. outportb(0x21,inportb(0x21) & 0xEF); Так? | Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 00:37 28-11-2011 | Исправлено: A1exSun, 00:47 28-11-2011 |
|