系列文章目录
FIFO队列一(原理)
FIFO队列二(静态环形队列实现)
FIFO队列三(动态队列实现)
前言
硬件:百问网100ASK_STM32F103_MINI开发板(STM32F103C8T6)
IDE:KEIL 5
按键GPIO口为:PA0
串口为:PA10(USART1_RX)、PA9(USART1_TX)
原理图如下:
提示:以下是本篇文章正文内容,下面案例可供参考
一、初始化队列
/*
函数名:
功能:初始化一个指定的环形缓冲区
输入参数:buffer_pst->指向目标缓冲区;
输入参数:size->表示缓冲区分配的内存大小,单位是字节
输出参数:
返回值:-1->表示错误;0->表示成功
*/
int iBufInit(pRingBuffer_TypeDef buffer_pst,uint16_t size){
if (buffer_pst == NULL || size == 0){
return -1;
}
if(buffer_pst->fifo == NULL){
buffer_pst->fifo = (uint8_t *)malloc(size);
}
buffer_pst->pr =0;
buffer_pst->pw = 0;
buffer_pst->buf_size = size;
return 0;
}
二、写队列
/*
函数名:
功能:
输入参数:
输出参数:
返回值:
*/
int iBufWrite(pRingBuffer_TypeDef buffer_pst,const uint8_t data){
if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
int i = (buffer_pst->pw+1)% buffer_pst->buf_size;
if(i != buffer_pst->pr){
buffer_pst->fifo[buffer_pst->pw] = data;
buffer_pst->pw = i; //(buffer_pst->pw+1)% buffer_pst->buf_size;
return 0;
}
return -1;
}
/*
函数名:
功能:
输入参数:
输出参数:
返回值:
*/
int iBufWriteBytes(pRingBuffer_TypeDef buffer_pst,const uint8_t * data_stream,uint8_t len){
int i = 0;
if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
if(data_stream == NULL) return -1;
if(len ==0) return -1;
for(i=0;i<len;i++){
if(iBufWrite(buffer_pst,data_stream[i]) != 0) break;
}
return i; //之后只要判断 len 是否 等于 i,就可以知道 是否存完完
}
三、读队列
/*
函数名:
功能:
输入参数:
输出参数:
返回值:
*/
int iBufRead(pRingBuffer_TypeDef buffer_pst, uint8_t * data){
if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
if(data == NULL) return -1;
if(buffer_pst->pr == buffer_pst->pw) return -1;
*data = buffer_pst->fifo[buffer_pst->pr];
buffer_pst->pr = (buffer_pst->pr+1)% buffer_pst->buf_size;
return 0;
}
/*
函数名:
功能:
输入参数:
输出参数:
返回值:
*/
int iBufReadBytes(pRingBuffer_TypeDef buffer_pst, uint8_t * data_stream,uint8_t len){
int i =0;
if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
if(data_stream == NULL) return -1;
if(len ==0) return -1;
for(i=0;i<len;i++){
if(iBufRead(buffer_pst,&data_stream[i]) != 0) break;
}
return i;
}
四、清除队列
/*
函数名:
功能:
输入参数:
输出参数:
返回值:
*/
int iBufClean(pRingBuffer_TypeDef buffer_pst){
if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
memset(buffer_pst->fifo,0,buffer_pst->buf_size);
buffer_pst->pr =0;
buffer_pst->pw = 0;
return 0;
}
五、初始化队列