Перейти к содержанию
    

Никак вы не хотите расстаться с порочной конструкцией 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"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне нравится. Я Вас сразу не понял.Думал повиснет.

while(rxc==0)

{

if(timout==1) break;

};

Попробую, но уже в ПНД

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...