A1exSun
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Abs62 Передачу тестирую. Получается передает первый символ, и срабатывает прерывание "10 - Данные приняты и доступны для чтения.", а не "01 - Буфер передатчика пуст. Сбрасывается при записи новых данных в регистр данных", как должно быть, и как есть если машина передает данные в никуда, то есть не подсоединена (выключена) вторая машина. Код: void sendfile(void) { // передатчик - запущено на первой машине ... com_init(); out.l = 27; while((inportb(C.PortAddr+5) & 0x20) == 0); out.i = 1; outportb(C.PortAddr,out.data[0]); // передача первого байта, дальше должно сработать прерывание и передать остальное getch(); cprintf("%d %d %d %d %d",out.i,error,p,r,inportb(C.PortAddr+6)); cprintf(" %d %d [%s] %x %d",inportb(C.PortAddr+5),rr,in.data,in.data[0],in.i); | Код: void receivefile(void) { // приемник - запущено на второй машине com_init(); in.i = 0; in.l = 27; while(in.i != in.l-1) { gotoxy(1,wherey()); clreol(); cprintf("%d",in.i); // количество принятых байт } ... | Код: void com_init(void) { // инициализация порта portoldvect = getvect(C.PortInt); setvect(C.PortInt,isr); 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+4,0x0B); // устанавливаем регистр состояния модема outportb(C.PortAddr+1,0x07); // устанавливаем регистр управления прерываниями outportb(C.PortAddr+2,0x00); // устанавливаем регистр управления режимом буферизации outportb(0x21,inportb(0x21) & 0xEF); } | Код: void interrupt far isr(void) { // обработчик прерывания COM-порта char intr = inportb(C.PortAddr+2); enable(); rr = intr; r++; if ((intr & 6) == 6) { // прерывание по линии состояния error = inportb(C.PortAddr+5); // регистр состояния линии p = inportb(C.PortAddr+6); } else if (((intr & 6) == 2) && (out.i < out.l)) { // буфер передатчика пуст outportb(C.PortAddr,out.data[out.i++]); } else if ((intr & 6) == 4) { // данные приняты in.data[in.i++] = inportb(C.PortAddr); // данные } disable(); outportb(0x20,0x20); } | Если вторая машина выключена, приемника нету, данные передаются в никуда - все нормально, передается все 27 байт (по крайней мере так пишет). Если включена - передается 1 байт из самой программы, потом один раз срабатывает прерывание о принятых данных (???) и там оказывается переданный байт. На другой машине принят только 1 байт. | Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 01:46 29-11-2011 | Исправлено: A1exSun, 01:52 29-11-2011 |
|