Queue参考代码

发布于:2025-08-16 ⋅ 阅读:(28) ⋅ 点赞:(0)

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