Queue参考代码
queue.c
#include "queue.h"
#include "stdlib.h"
// 初始化循环队列
void initializeCircularQueue(CircularQueue *cq, uint8_t *buffer, uint32_t size) {cq->front = 0;cq->rear = 0;cq->count = 0;cq->size = size;cq->data = buffer;
}// 入队操作(数组形式)
// 入队空数组以清空队列
uint8_t enqueueArray(CircularQueue *cq, uint8_t arr[], uint32_t size) {if(0 == arr) //丢弃数据{cq->count = 0;cq->front = cq->rear;return 0;}if ((size == 0) || (size > (cq->size-cq->count))) {return -1;}for (uint32_t i = 0; i < size; i++) {cq->data[cq->rear] = arr[i];cq->rear = (cq->rear + 1) % (cq->size);}cq->count = cq->count + size;return 0;
}// 出队操作(数组形式)
uint8_t dequeueArray(CircularQueue *cq, uint8_t arr[], uint32_t size) {if ((cq->count < size) || (size ==0)) { // 判断循环队列是否有足够元素出队return -1;}for (uint32_t i = 0; i < size; i++) {arr[i] = cq->data[cq->front];cq->front = (cq->front + 1) % (cq->size); // 使用循环队列的特性}cq->count = cq->count - size;return 0;
}
queue.h
#ifndef __QUEUE_H_
#define __QUEUE_H_#include <stdint.h>typedef struct {uint8_t *data; //front rear需要占用一个位置uint32_t size; //保存队列中最大容纳元素个数uint32_t front;uint32_t rear;uint32_t count; //保存队列中的元素个数
} CircularQueue;void initializeCircularQueue(CircularQueue *cq, uint8_t *buffer, uint32_t size) ;
uint8_t enqueueArray(CircularQueue *cq, uint8_t arr[], uint32_t size);
uint8_t dequeueArray(CircularQueue *cq, uint8_t arr[], uint32_t size);#endif
初始化
static uint8_t modbus_recvbuf[256] = {0};
CircularQueue modbus_queue;void modbus_init()
{initializeCircularQueue(&modbus_queue, modbus_recvbuf, sizeof(modbus_recvbuf));
}
入队出队
数据数组是ethernet_recvbuf,因为可能粘包半包问题所以需要队列处理
一旦找到个整包,出队到modbus_handlebuf中去
enqueueArray(&modbus_queue, ethernet_recvbuf, size);
dequeueArray(&modbus_queue, modbus_handlebuf, size);