|
发表于 2013-2-20 18:59:20
|
显示全部楼层
faw 发表于 2013-2-20 06:18
如果刚刚满就执行rx_counter=0;的话,那缓存区最多只能存7个数据,存第8个数据的时候,下面的while(rx_co ...
你需要全面地看一下这个程序,完整的接收程序是这样的:
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
你有疑问的 if (++rx_counter == RX_BUFFER_SIZE) 这段语句是放在USART接收中断里执行的,而接收中断是配合getchar()这个函数去做的,正常的使用流程是:调用getchar()→等待用户输入→RX中断产生→getchar返回用户输入的字符。在getchar函数里,只要rx_counter不为0,就立刻返回数据,同时rx_counter-1,因此你说的情况是不可能发生的。除非用户以超过MCU指令执行频率的速度敲击键盘,并且键盘的反应也超过MCU指令执行频率,才会出现你说的情况。 |
|