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