gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:44:07 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com