c - 如何使用 atmega 退出 USART ISR?

标签 c avr atmega

我有一个 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/

相关文章:

c - 取消引用指针而不将它们指向变量

c - 如何在内联汇编中替换32位变量的字节?

c - 使用 DMXSerial Arduino 库发送和接收 DMX-512

C - atmega328p - 我不明白出了什么问题

c - 保存 .txt 文件的每三个字符的代码有什么问题?

c - 有谁知道如何阻止 GTK g_type_init() 出现

c - 数据类型使用不准确导致计算不准确

c - 如何从 xmega 读取输入然后将其显示在 super 终端上

c - 用于自动制动系统的激光雷达传感器的速度测量

c - AVR GCC - 使用静态库 - undefined reference 错误