一、关于队列文件的处理如下
头文件
#ifndef _FIFO_H_
#define _FIFO_H_
typedef struct fifo_t {
uint8_t *buf;
uint32_t size;
uint32_t in;
uint32_t out;
} _fifo_str;
#define min(x,y) ((x) < (y)?(x):(y))
int FifoInit(uint8_t *fifo_addr, uint32_t fifo_size);
int FifoDataLen(void);
int FifoSpaceLen(void);
int FifoRead(uint8_t *buf, uint32_t len);
int FifoWrite(uint8_t *buf, uint32_t len);
void FifoClear(void);
#endif
c文件
#include "fifo.h"
#include "string.h"
_fifo_str fifo_str;
int FifoInit(uint8_t *fifo_addr, uint32_t fifo_size)
{
_fifo_str *p = &fifo_str;
if(fifo_addr == NULL || fifo_size == 0)
return -1;
memset((char *)p, 0, sizeof(_fifo_str));
p->buf = fifo_addr;
p->in = 0;
p->out = 0;
p->size = fifo_size;
return 0;
}
int FifoDataLen(void)
{
_fifo_str *p = &fifo_str;
return (p->in - p->out);
}
int FifoSpaceLen(void)
{
_fifo_str *p = &fifo_str;
return (p->size - (p->in - p->out));
}
int FifoRead(uint8_t *buf, uint32_t len)
{
uint32_t i = 0, j = 0;
_fifo_str *p = &fifo_str;
j = (p->out % p->size);
len = min(len, p->in - p->out);
i = min(len, p->size - j);
memcpy(buf, p->buf + j, i);
memcpy(buf + i, p->buf, len - i);
p->out += len;
return len;
}
int FifoWrite(uint8_t *buf, uint32_t len)
{
uint32_t i = 0, j = 0;
_fifo_str *p = &fifo_str;
j = p->in % p->size;
len = min(len, p->size - p->in + p->out);
i = min(len, p->size - j);
memcpy(p->buf + j, buf, i);
memcpy(p->buf, buf + i, len - i);
p->in += len;
return len;
}
void FifoClear(void)
{
_fifo_str *p = &fifo_str;
p->in = 0;
p->out = 0;
}
二、关于如何使用调用
1、在回调函数中调用
(1)、当接收的数据不确定长度时
if (FifoSpaceLen() >= huart->RxXferCount)
{
FifoWrite(huart->pRxBuffPtr, huart->RxXferCount);
}
(2)、当接收的数据确定长度。
FifoWrite(串口接收的数据, 当前要从串口接收的数据长度);
2、在main主函数中调用
初始化 FifoInit(pdata, LEN);
读取队列中的数据
len = FifoDataLen();
if (len > 0)
{
FifoRead(buf, tx_len);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)