我有一个 atmega 1284p 的问题,我写了这个 ISR 来通过串口接收命令。 如果我将 CR 或 LF 发送到命令的末尾,程序将正常运行,但如果我不发送它们中的任何一个,程序将停留在 ISR 中阻止我的程序。
由于 ISR 禁用了所有中断,我不知道如何摆脱它!
有人可以帮助我吗?
void USART_init(void)
{
UCSR0B |= (1<<RXEN0) | (1<<TXEN0);
UCSR0C &= ~(1<<USBS0); //Stop bits 1
UCSR0C &= ~((1<<UPM00) | (1<<UPM01)); //Parity check disabled
UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01); //8 bit data
UCSR0B &= ~(1<<UCSZ02); //8 bit data continue
UCSR0B |= (1 << RXCIE0);
UBRR0H = 0;
UBRR0L = 64; //9600 baud for a 16MHz Clock.
}
unsigned char USART_receive(void)
{
while(!(UCSR0A & (1<<RXC0)));
return UDR0;
}
ISR(USART0_RX_vect)
{
clean_variables();
do {
cmd[inc] = USART_receive();
inc++;
} while ((cmd[inc - 1] != '\n') && (command[inc - 1] != '\r'));
inc = 0;
comd = 1;
split();
}
最佳答案
这个程序违背了使用中断的目的。您在收到第一个字符时触发中断,然后从那里开始轮询。相反,您应该为每个字符触发一次中断,然后尽快离开 ISR。
基于中断的 UART 接收的常用技术是使用环形缓冲区,您从 ISR 填充它,从调用者清空它。还要记住重新进入!始终,对于您编写的每个中断,没有异常(exception)。
关于c - 如何使用 atmega 退出 USART ISR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58283375/