当前位置: 首页 > news >正文

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);
http://www.lryc.cn/news/619681.html

相关文章:

  • CompletableFuture介绍及使用方式
  • 闹钟时间到震动与声响提醒的实现-库函数版(STC8)
  • 基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算)实践
  • 计算机网络——协议
  • LangGraph 指南篇-基础控制
  • Linux软件编程3.(文件IO和目录IO)
  • 谷歌、facebook、tiktok广告账户多开怎么安全?亚马逊、ebay、shopee多店铺怎么做好?看看adspower工具,注册免费试用及实用技巧分享
  • 美团搜索推荐统一Agent之交互协议与多Agent协同
  • 在es中安装kibana
  • 动静态库
  • ICCV 2025 | 4相机干掉480机位?CMU MonoFusion高斯泼溅重构4D人体!
  • 内容索引之word转md工具 - markitdown
  • (cvpr2025) IceDiff: 高分辨率北极海冰预报
  • duiLib 利用布局文件显示一个窗口并响应事件
  • 基于UniApp的新大陆物联网平台温湿度检测系统开发方案
  • 在JVM跑JavaScript脚本 | Oracle GraalJS 简介与实践
  • 【AI论文】GLM-4.5:具备智能体特性、推理能力与编码能力的(ARC)基础模型
  • Avalon-MM协议
  • 浅层神经网络
  • SimD小目标样本分配方法
  • 开发避坑指南(24):RocketMQ磁盘空间告急异常处理,CODE 14 “service not available“解决方案
  • 设计原则之【抽象层次一致性(SLAP)】,方法也分三六九等
  • 从零到一:TCP 回声服务器与客户端的完整实现与原理详解
  • Linux LNMP配置全流程
  • 机器学习之词向量转换
  • 第5章 学习的机制
  • 对比学习中核心损失函数的发展脉络
  • AI服务器需求激增,三星内存与SSD供不应求,HBM与DDR5成关键驱动力
  • 2025年高效能工程项目管理软件推荐榜单:AI重构工程进度可视化与资源动态调度体系
  • kernel pwn 入门(四) ret2dir详细