=GM= 0 21 января, 2012 Опубликовано 21 января, 2012 · Жалоба Никак вы не хотите расстаться с порочной конструкцией while (((((status=UCSR1A) & RX_COMPLETE_1)==0)) && RxTimOvf==0) ; Получается, что вам всё едино, принят ли байт, таймаут ли наступил, всё равно вы байт читаете. На самом деле вам нужно ИЛИ принять байт ИЛИ завершить приём, если наступил таймаут. Попробуйте так errcnt=0; for(i=0;i<20;i++) { while(rxc==0) { if(timout==1) break; }; if(timout==1) break; if(err) errcnt++; rdms[i]=UDR1; } Здесь "timout" это ваш "RxTimOvf==1", а "err" - "status & (FRAMING_ERROR_1 | PARITY_ERROR_1 | DATA_OVERRUN_1 ))!=0". "errcnt" - счётчик ошибок в пакете. Можно обойтись одним оператором if(timout==1) break, но тогда вместо break придётся использовать оператор goto, который в си персона нон грата... Также посоветую вам избегать длинных названий, типа "temp_1_i" вместо просто "i" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
messenger 1 21 января, 2012 Опубликовано 21 января, 2012 · Жалоба Мне нравится. Я Вас сразу не понял.Думал повиснет. while(rxc==0) { if(timout==1) break; }; Попробую, но уже в ПНД Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться