stm32串口环形缓冲区
一、ringbuff.h
#ifndef _RING_BUFFER_H_
#define _RING_BUFFER_H_
enum
{
RING_FALSE,
RING_TRUE,
};
enum
{
RING_ERR,
RING_OK,
};
typedef struct ringBuff{
unsigned int head;
unsigned int tail;
unsigned int size;
unsigned char *buffer;
}RingBuff_t, *pRingBuff_t;
void RingBuff_Init(RingBuff_t *pRingBuff, unsigned char *pBuff, unsigned int buf_size);
int RingBuff_ReadNByte (RingBuff_t *pRingBuff, unsigned char *pData, int size);
int RingBuff_WriteNByte(RingBuff_t *pRingBuff, unsigned char *pData, int size);
int RingBuff_GetLen(RingBuff_t *pRingBuff);
unsigned char RingBuff_GetHeadItem(RingBuff_t *pRingBuff);
unsigned char RingBuff_GetIndexItem(RingBuff_t *pRingBuff, int index);
#endif
二、ringbuff.c
#include "ring_buffer.h"
#include "main.h"
#include "stdio.h"
void RingBuff_Init(RingBuff_t *pRingBuff, unsigned char *pBuff, unsigned int buf_size)
{
if(NULL == pRingBuff || NULL == pBuff)
return;
pRingBuff->head = 0;
pRingBuff->tail = 0;
pRingBuff->size = buf_size;
pRingBuff->buffer = pBuff;
}
int RingBuff_isEmpty(RingBuff_t *pRingBuff)
{
if(NULL == pRingBuff)
return RING_FALSE;
if(pRingBuff->head == pRingBuff->tail)
{
return RING_TRUE;
}
return RING_FALSE;
}
static int RingBuff_isFull(RingBuff_t *pRingBuff)
{
if(NULL == pRingBuff)
return RING_FALSE;
if((pRingBuff->tail+1)%pRingBuff->size == pRingBuff->head)
{
return RING_TRUE;
}
return RING_FALSE;
}
int RingBuff_ReadOneByte(RingBuff_t *pRingBuff, unsigned char *pData)
{
if(NULL == pRingBuff || NULL == pData)
return RING_ERR;
if(RING_TRUE == RingBuff_isEmpty(pRingBuff))
{
return RING_ERR;
}
*pData = pRingBuff->buffer[pRingBuff->head];
pRingBuff->head = (pRingBuff->head+1)%pRingBuff->size;
return RING_OK;
}
static int RingBuff_WriteOneByte(RingBuff_t *pRingBuff, unsigned char *pData)
{
if(NULL == pRingBuff || NULL == pData)
return RING_ERR;
if(RING_TRUE == RingBuff_isFull(pRingBuff))
{
return RING_ERR;
}
pRingBuff->buffer[pRingBuff->tail] = *pData;
pRingBuff->tail = (pRingBuff->tail+1)%pRingBuff->size;
return RING_OK;
}
int RingBuff_ReadNByte(RingBuff_t *pRingBuff, unsigned char *pData, int size)
{
if(NULL == pRingBuff || NULL == pData)
return RING_ERR;
for(int i = 0; i < size; i++)
{
RingBuff_ReadOneByte(pRingBuff, pData+i);
}
return RING_OK;
}
int RingBuff_WriteNByte(RingBuff_t *pRingBuff, unsigned char *pData, int size)
{
if(NULL == pRingBuff || NULL == pData)
return RING_ERR;
for(int i = 0; i < size; i++)
{
RingBuff_WriteOneByte(pRingBuff, pData+i);
}
return RING_OK;
}
int RingBuff_GetLen(RingBuff_t *pRingBuff)
{
if(NULL == pRingBuff)
return RING_ERR;
if(pRingBuff->tail >= pRingBuff->head)
{
return pRingBuff->tail - pRingBuff->head;
}
return pRingBuff->tail + pRingBuff->size - pRingBuff->head;
}
unsigned char RingBuff_GetHeadItem(RingBuff_t *pRingBuff)
{
if(NULL == pRingBuff)
return RING_ERR;
return pRingBuff->buffer[pRingBuff->head];
}
unsigned char RingBuff_GetIndexItem(RingBuff_t *pRingBuff, int index)
{
if(NULL == pRingBuff || index > pRingBuff->size-1)
return RING_ERR;
return pRingBuff->buffer[index%pRingBuff->size];
}
三、应用例程(配合串口接受DMA使用)
extern UART_HandleTypeDef huart1;
RingBuff_t Uart1_RingBuff;
uint8_t USART1_DMA_Buff[USART1_DMA_SIZE];
uint8_t USART1_RingBuff[USART1_RING_BUFF_SIZE];
void Data_InterFace_Init(void)
{
RingBuff_Init(&Uart1_RingBuff, USART1_RingBuff, USART1_RING_BUFF_SIZE);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(&huart1 == huart)
{
RingBuff_WriteNByte(&Uart1_RingBuff, USART1_DMA_Buff, USART1_DMA_SIZE);
HAL_UART_Receive_DMA(&huart1, USART1_DMA_Buff, USART1_DMA_SIZE);
}
}
void Board_Init(void)
{
Data_InterFace_Init();
HAL_UART_Receive_DMA(&huart1, USART1_DMA_Buff, USART1_DMA_SIZE);
}
void Uart_Dma_Task(void const * argument)
{
pParameter_t parameter = NULL;
pRingBuff_t pRingBuff = NULL;
uint8_t data_buff[10];
uint8_t flag, t_data;
parameter = (pParameter_t)argument;
pRingBuff = parameter->Data_InterFace[UART1_NUM].pRingBuffCB;
for(;;)
{
while(!RingBuff_isEmpty(pRingBuff))
{
if(RingBuff_GetHeadItem(pRingBuff) == 0xEB
&&RingBuff_GetIndexItem(pRingBuff, pRingBuff->head+1) == 0x90)
{
if(RingBuff_GetLen(pRingBuff) >= 10)
{
RingBuff_ReadNByte(pRingBuff, data_buff, 10);
flag = 1;
}
else
{
break;
}
}
else
{
RingBuff_ReadOneByte(pRingBuff, &t_data);
}
}
if(1 == flag)
{
flag = 0;
BSP_Uart1_SendData(data_buff, 10);
}
osDelay(10);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)