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);