简介
这个环形BUFF是 根据Nordic 官方SDK修改而来,适用于单片机串口数据处理
代码
m_fifo.h
#ifndef _M_FIFO_H
#define _M_FIFO_H
#define M_SUCCESS 0
#define M_ERROR 0XFF
#define RX_BUF_SIZE 512
#define MSG_START 0xA8
#define MSG_END 0xBB
typedef struct
{
u8* p_buf;
u16 buf_size_mask;
volatile u32 read_pos;
volatile u32 write_pos;
} app_fifo_t;
#define FIFO_LENGTH(p_fifo) fifo_length(p_fifo)
static u32 fifo_length(app_fifo_t * p_fifo);
static void fifo_put(app_fifo_t * p_fifo, u8 byte);
static void fifo_get(app_fifo_t * p_fifo, u8 * p_byte);
u32 app_fifo_get(app_fifo_t * p_fifo, u8 * p_byte);
u32 app_fifo_put(app_fifo_t * p_fifo, u8 byte);
u32 app_fifo_init(app_fifo_t * p_fifo, u8 * p_buf, u16 buf_size);
void app_uart_init(void);
#endif
m_fifo.c
#include "m_fifo.h"
int IS_POWER_OF_TWO(int n)
{
if(n<1) return 0;//2的次幂一定大于0
return ((n & (n -1)) == 0);
}
static u32 fifo_length(app_fifo_t * p_fifo)
{
u32 tmp = p_fifo->read_pos;
return p_fifo->write_pos - tmp;
}
static void fifo_put(app_fifo_t * p_fifo, u8 byte)
{
p_fifo->p_buf[p_fifo->write_pos & p_fifo->buf_size_mask] = byte;
p_fifo->write_pos++;
}
static void fifo_get(app_fifo_t * p_fifo, u8 * p_byte)
{
*p_byte = p_fifo->p_buf[p_fifo->read_pos & p_fifo->buf_size_mask];
p_fifo->read_pos++;
}
u32 app_fifo_get(app_fifo_t * p_fifo, u8 * p_byte)
{
if (FIFO_LENGTH(p_fifo) != 0)
{
fifo_get(p_fifo, p_byte);
return M_SUCCESS;
}
return M_ERROR;
}
u32 app_fifo_put(app_fifo_t * p_fifo, u8 byte)
{
if (FIFO_LENGTH(p_fifo) <= p_fifo->buf_size_mask)
{
fifo_put(p_fifo, byte);
return M_SUCCESS;
}
return M_ERROR;
}
u32 app_fifo_init(app_fifo_t * p_fifo, u8 * p_buf, u16 buf_size)
{
if (p_buf == NULL)
{
return M_ERROR;
}
if (!IS_POWER_OF_TWO(buf_size))
{
return M_ERROR;
}
p_fifo->p_buf = p_buf;
p_fifo->buf_size_mask = buf_size - 1;
p_fifo->read_pos = 0;
p_fifo->write_pos = 0;
return M_SUCCESS;
}
app_fifo_t m_rx_fifo;
static u8 rx_buf[RX_BUF_SIZE] = {0};
void app_uart_init()
{
app_fifo_init(&m_rx_fifo,rx_buf,RX_BUF_SIZE);
uart_init(115200);//这里是你自己单片机的串口初始化
}
main.c
/*这里只是个大概的框架,自己写的时候添加自己的头文件变量*/
#include "m_fifo.h"
#include "xxx" //这里添加你自己的头文件
void USART3_IRQHandler(void) //这是你自己单片机的串口中断
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Res = USART_ReceiveData(USART3);
if(M_ERROR== app_fifo_put(&m_rx_fifo,Res))
{
LOG_DEBUG("recv error \r\n");
}
}
}
void Update_Message(u8* data,u32* index)
{
static u32 start_index = 0;
static u32 end_index = 0;
if(data[*index] == MSG_START)
{
/*处理自己的协议,逻辑处理*/
}
}
void Analyd_Data()//获取串口fifo数据
{
static u32 dataindex = 0; //这里静态或者全局
static u8 CmdRecBuf[RX_BUF_SIZE] = {0};//这里静态或者全局
u32 index_data = 0;
while(app_fifo_get(&m_rx_fifo,&CmdRecBuf[dataindex%RX_BUF_SIZE]) == M_SUCCESS)
{
index_data = dataindex%RX_BUF_SIZE;
Update_Message(CmdRecBuf,&index_data);
dataindex++;
}
}
int main()
{
app_uart_init();//初始化串口
while(1)
{
Analyd_Data();
}
return 0;
}