参考这篇文章,我认为写的很不错;我做了一些修改:防止队列满了后一帧数据分散开来,一部分在尾部,一部分在头部。
uart与uart之间的通信(队列缓存)_huangcheng188的博客-CSDN博客
int uart_receive_analysis(void)
{
#define LEN 4 //最小的一帧数据具有的长度
uint32_t count = sUART_REV_DATA_T.count;
uint32_t header = sUART_REV_DATA_T.header;
uint32_t tailer = sUART_REV_DATA_T.tailer;
uint32_t length = 0;
if(count >= LEN )
{
if(sUART_REV_DATA_T.buffer[(tailer + 0) % UART_BUF_LEN] == 0xAA &&
sUART_REV_DATA_T.buffer[(tailer + 1) % UART_BUF_LEN] == 0x55)
{
length = sUART_REV_DATA_T.buffer[(tailer + 2) % UART_BUF_LEN]; //记录有效的长度
if(count >= length+3)//为什么加3? 头+有效长度信息 0xAA 0x55 LEN 刚好是3
{
data_copy(length+3);
sUART_REV_DATA_T.count = sUART_REV_DATA_T.count - length - 3;
sUART_REV_DATA_T.tailer = (sUART_REV_DATA_T.tailer + length + 3) % UART_BUF_LEN;
test++;
if(header > UART_BUF_LEN - 100)
{
//防止队列满了后一帧数据分散开来,一部分在尾部,一部分在头部。
sUART_REV_DATA_T.count = 0;
sUART_REV_DATA_T.header = 0;
sUART_REV_DATA_T.tailer = 0;
}
return 0;
}
else
{
return -3;//不足一帧是继续等待,实际中可以做个超时处理
}
}
else
{
sUART_REV_DATA_T.count = sUART_REV_DATA_T.count - 1;
sUART_REV_DATA_T.tailer = (sUART_REV_DATA_T.tailer + 1) % UART_BUF_LEN;
return -2;
}
}
else
{
//防止队列满了后一帧数据分散开来,一部分在尾部,一部分在头部。
if(header > UART_BUF_LEN - 100)
{
sUART_REV_DATA_T.count = 0;
sUART_REV_DATA_T.header = 0;
sUART_REV_DATA_T.tailer = 0;
}
return -1;
}
}