前言:
眼前看官们对“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语言举几个无限循环的例子