Получение прерывания Keil UART зависает в функции printf()
Программа зависает в printf ().
void UART0_ISR(void) interrupt 4 { if (RI == 1) { RI = 0; TI = 1; Count = 444; datau[temp] = SBUF; // Read receive data SBUF = 0;// datau[temp]; // Send back same data on uart Count=1; if(temp < 10) { temp =temp+1; } if(temp >10) { temp=0; } uartreceive=1; Count = 444; } else TI = 0; } void main() { AUXR1|=0x00; PCON&=0x7F; SCON = 0x50; // SCON: mode 1, 8-bit UART, enable rcvr TMOD&=0xAF; TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload TH1 = 0xFA ; // TH1: reload value for 1200 baud @ 16MHz TR1 = 1; // TR1: timer 1 run TI = 1; // TI: set TI to send first char of UART ES = 1; // Enable serial interrupt EA = 1; Count=123; temp=0; while(1) { Delay_ms(100); Count=102; printf("sss\n %u",Count); //My program is getting hangs here if(uartreceive==1) { uartreceive=0; Count=4; printf("Entire array is %s %u\n",datau,temp); Count=105; printf("\nindex %u %c %c\n",temp,datau[0],datau[1]); Count=106; sprintf(datau," "); Count=107; temp=0; uartreceive=0; Count=104; } } }
Что я уже пробовал:
Я пытаюсь общаться с ПК с помощью UART. Он работает, но застрял в функции printf () внутри цикла while. Я не знаю, что это ошибка, которую я сделал.
barneyman
вы находитесь в середине процедуры прерывания обслуживания-вы должны выйти как можно быстрее и не делать никаких блокирующих вызовов
поместите данные в заранее выделенный буфер, и пусть другой, обычный поток что-нибудь с ними сделает
S.Soundar
Я проверил, сэр. Но прерывание работает нормально. Если я выну функцию Delay_ms(100), она будет работать нормально. Но если я использую задержку, программа зависает на printf ().
Вот мой код функции задержки:
void Delay_us(unsigned int us_count)
{
while (us_count!=0)
{
us_count--;
}
}
void Delay_ms(unsigned int ms_count)
{
while (ms_count!=0)
{
Delay_us(550); / / delay_us вызывается для генерации задержки 1 мс
ms_count--;
Кол-во=ms_count;
}
}
barneyman
вам нужна какая - то форма блокировки чтения/записи в этом буфере данных-в настоящее время он может измениться во время обхода printf
[no name]
Ли Е использовать UART для связи с хост-компьютера?
S.Soundar
Да, побрякушки.
[no name]
В этом, вероятно, и заключается проблема. Вы взяли на себя ISR UART.
Если устройство имеет два UART - используйте один для отладки / трассировки через printf, а другой-для вашего приложения.