龙空技术网

C语言循环队列解决数据缓存难题

yasindar 210

前言:

眼前看官们对“c语言举几个无限循环的例子”大致比较讲究,我们都需要了解一些“c语言举几个无限循环的例子”的相关资讯。那么小编在网上汇集了一些对于“c语言举几个无限循环的例子””的相关知识,希望咱们能喜欢,各位老铁们快快来学习一下吧!

很多设备都是串口设备,需要串口通信。往往直接写通信协议,移植性,稳定性很差。有没有对处理AT指令很头疼的情况?有没有通用一些的代码呢?

首先把串口收到的数据先存在一个循环队列队列里,然后消费者从队列中拿出数据来消费。

不仅限于出口通信,其他需要存储队列的地方都可以通用。

不废话,直接上代码,有注释。

//定义循环区域的大小

#define BUFFER_SIZE 8 //必须是8的倍数

#define MAX_RX_FRAME_SIZE 200

#define MAX_RX_FRAME_ID_SIZE 15

//定义接收数据帧格式,可以根据需要更改内容。

typedef struct {

unsigned char Frame[MAX_RX_FRAME_SIZE];

unsigned char Identifier[MAX_RX_FRAME_ID_SIZE];

uint8_t Size;

uint8_t IdentifierSize;

} Frame_t;

//定义循环队列

typedef struct {

Frame_t buffer[BUFFER_SIZE];

uint8_t head;

uint8_t tail;

uint8_t count;

} CircularBuffer;

//初始化循环队列

void init(CircularBuffer *cb) {

cb->head = 0;

cb->tail = 0;

cb->count = 0;

}

//判断循环队列是否为空

int is_empty(CircularBuffer *cb) {

return (cb->count == 0);

}

//判断循环队列是否装满

int is_full(CircularBuffer *cb) {

return (cb->count == BUFFER_SIZE);

}

//入队

int enqueue(CircularBuffer *cb, Frame_t data) {

if (is_full(cb)) { //队列已满

//head + 1后与BUFFER_SIZE求余,就可以直接回到起点0

cb->head = (cb->head + 1) % BUFFER_SIZE;

}

else

{

cb->count++;

}

memcpy ((cb->buffer) + (cb->tail),&data,sizeof (Frame_t));

cb->tail = (cb->tail + 1) % BUFFER_SIZE;

return 1; // success

}

//出队

Frame_t dequeue(CircularBuffer *cb) {

if (is_empty(cb)) {

Frame_t emptyFrame = { 0 };

return emptyFrame;

}

Frame_t data;

memcpy (&data,(cb->buffer) + (cb->head),sizeof (Frame_t));

cb->head = (cb->head + 1) % BUFFER_SIZE;

cb->count--;

return data;

}

% BUFFER_SIZE是重点,有看懂的请留言哦!!!

标签: #c语言举几个无限循环的例子