可以利用FIFO来解决单片机接收数据过程中的阻塞现象。
#define RXBUF_SIZE 32 //接收FIFO的最大容量
unsigned char RX_BUFF[RXBUF_SIZE]; //接收FIFO缓冲区数组
unsigned int UART_InputLen =0; // 接收FIFO内待读取的字节数
unsigned int RX_IndexR =0; // 接收FIFO的读指针
unsigned int RX_IndexW =0; //接收FIFO的写指针
从串口读取1字节数据(从缓冲队列中读取一字节已接收的数据)
char UART0_GetChar(unsigned char *Char)
{
if(UART_InpLen == 0) //如果FIFO内无数据,返回0
return 0;
_DINT(); // 涉及FIFO操作时不允许中断,以免指针错乱
UART_InpLen--; // 待读取指针数减一
*Char = RX_BUFF[RX_IndexR]; // 从尾指针读取一个字节作为返回值
if(++RX_IndexR >= RXBUF_SIZE) // 读指针递增,且判断是否下标越界
{
RX_IndexR=0; // 如果越界则写指针归零(循环队列)
_EINT(); // FIFO操作完毕,恢复中断允许
}
return 1;
}
// 获取FIFO内已接受的数据字节数
unsigned int UART0_GetCharsInRxBuf()
{
return (UART_InpLen);
}
/ 清除接收FIFO区
void UART0_ClrRxBuf()
{
_DINT();
UART_InpLen =0;
RX_IndexR =0;
RX_IndexW =0;
_EINT();
}
/串口中断接收程序
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RX(void)
{
UART_InpLen++;
RX_BUFF[RX_IndexW] = U0RXBUF;
if(++ RX_IndexW >= RXBUF_SIZE)
{
RX_IndexW=0;
}
}///主程序
void main(void)
{
unsigned char RxDataBuff[8];
int i;
......
_UART_ENINT(); // uart interrupt enable
_EINT(); // enable all interrupts
while(1)
{
_delay_ms(1000);
if(UART0_GetCharsInRxBuf()>=8)
{
for(i=0;i<8;i++)
UART0_GetChar(RxDataBuff+i);
}
}
}