从串口中断中读取一帧数据RS485_DMA_RxBuf,把这帧数据通过对列的方式缓存起来,应用层再通过读取缓存值进行相关处理。这样的缓存方式,可以有效的避免了应用层还没来得及处理数据,驱动层就把数据给覆盖了的问题。
首先先定义一个队列头*Head、队列尾*Tail、数组RxBuf[UART_RX_BUF_SIZE],UART_RX_BUF_SIZE 为整个队列能缓存最长的数据长度。
u8 *pHead;
u8 *pTail;
void Uart_Read(u16 Len)
{
u8 FrameNo = 0;
u8 LastFrameNo = 0;
u16 TransLen = 0;
if(FrameNo++ >= 10)
{
FrameNo = 0;
}
LastFrameNo = (FrameNo==0)?9:(FrameNo-1);
Head[FrameNo] = Tail[LastFrameNo];//上一帧的队尾作为下一帧的队头
if(Len>= UART_RX_BUF_SIZE -(Head[FrameNo]-RxBuf))
{
//如果队列的剩余空间已经小于读取长度,多的部分用RxBuf缓存
TransLen = UART_RX_BUF_SIZE -(Head[FrameNo]- RxBuf)
memcpy(Head[FrameNo],RS485_DMA_RxBuf,TransLen);
memcpy(RxBuf,RS485_DMA_RxBuf+TransLen ,Len-TransLen);
Tail[FrameNo] = RxBuf+Len-TransLen;
}
else
{
memcpy(Head[FrameNo],RS485_DMA_RxBuf,Len);
Tail[FrameNo] = Head[FrameNo]+Len;
}
}