嵌入式中缓冲区队列的实现

2023-05-16

在串口,IIC或SPI以及CAN等通信中,往往需要一次性发送一帧完整的数据,由于硬件发送的速度问题,硬件不能及时发送出去,就会导致数据丢失等一系列问题。通常采用建立缓冲区解决。队列可以有效的利用缓冲区空间,并且保证数据在发送和接收过程中的时序问题。现在网上有公开的队列源码,其一般由入队,出队,查询队列成员数量,创建队列,销毁队列等组成,相对比较完善,但是在串口等环境中使用存在过多的调用函数等问题。所以就以上的情况做出了改善,编写了一个精简的缓冲队列,经过测试可以保证数据传输的完整性。

一、创建结构体

结构体主要由 缓冲区,队列头指针,队列尾指针,以及队列发送完成标志位组成。

/*******
数据发送缓冲区 结构体
*****/
typedef struct 
{
    u8 TxBuff[BUFFSIZE]; //缓冲区
    u16 font;                        //头指针
    u16 rear;             //尾指针
    u8 finished;         //发送完成,0代表未发送完,1代表发送完成,发送终止
 }TxBuffer;

二 入队函数

将发送的数据存入缓冲数组,并且移动相应长度的尾指针,检查发送标志位,判断是否需要启动硬件发送。主要有两个函数,一个为单字节发送个,另一个为多字节发送。

/*
 *函数名:UsartSendData
 *描述:串口发送数据,发送单字节
 *输入:tx:发送接口
 *输出:无
 *调用:外部调用
 */
void UsartSendData(ConnIFName tx,u8 data,USART_TypeDef* u)
{
        TxBuffer* buff = GetTxBuffer(tx);
      //占用1字节用于判断是否到达缓冲区尾部
        if(buff->rear == BUFFSIZE) buff->rear=0;
        buff->TxBuff[buff->rear++]=data;
        if(buff->finished == 1)
        {
            buff->finished=0;
            if(buff->font == BUFFSIZE) buff->font=0;
            USART_SendData(u,buff->TxBuff[buff->font]);
            buff->TxBuff[buff->font] = 0xFF;
            buff->font++;
        }
}

/*
 *函数名:MultitySend()
 *描述:串口发送数据,多字节发送
 *输入:tx->发送接口 ;sendData[] 发送的数组;u->调用发送的硬件串口;len->发送的长度
 *输出:无
 *调用:外部调用
 */
void MultitySend(ConnIFName tx,u8 data[],USART_TypeDef* u,u8 len)
{
    u8 i=0;
    TxBuffer* buff = GetTxBuffer(tx);
    if(len<BUFFSIZE-buff->rear+buff->font)
    {
        for(i=0;i<len;i++)
        {
            if(buff->rear == BUFFSIZE) buff->rear=0;
            buff->TxBuff[buff->rear++] = data[i];
        }   
        if(buff->finished !=0)
        {
            if(buff->font == BUFFSIZE) buff->font=0;
            USART_SendData(u,buff->TxBuff[buff->font++]);   
            buff->finished =0;
        }
    }
}

三 出队函数

读取队列中的数据并交由硬件发送,同时移动头指针到相应位置,根据情况操作标志位。这个函数一般由发送中断调用。

/*
 *函数名:TxBuffIRQ
 *描述:串口发送
 *输入:tx:发送接口
 *输出:无
 *调用:中断调用
 */
void TxBuffIRQ(ConnIFName tx,USART_TypeDef* u)
{
        //取得该通信接口缓冲区指针
        TxBuffer* buff = GetTxBuffer(tx);
         //判断缓冲区为NULL,则发送完成,停止发送
        if(buff->font == buff->rear )   
        {
            buff->finished=1;    //发送完成置位(缓冲区为空)
        }else
        {
        //判断是否到达队列尾部,如果到达则从头开始
        /**防止由于时间差的问题导致中断重复发送缓冲区数据*****/
            if(buff->font == BUFFSIZE ) buff->font=0; 
            USART_SendData(u,buff->TxBuff[buff->font]);
            //0xff填充缓冲区
            buff->TxBuff[buff->font] = 0xff;
            buff->font++;
        }
}

四 获取队列函数

当多个队列共存时,需要由该函数传递对应队列的指针,以便操作队列。

/*
 *函数名:GetTxBuffer
 *描述:取得发送缓冲区指针
 *输入:tx:取得哪个值
 *输出:无
 *调用:内部调用
 */
TxBuffer* GetTxBuffer(ConnIFName tx)
{
        switch (tx)
        {
            case DGUSIF:
                return &DgusTxBuff; 
            case WKIF:
                return &WKTxBuff;
            case CK1IF:
                return &CKTxBuff;
            default:
                break;
        }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式中缓冲区队列的实现 的相关文章

  • 故障解决:端口已被占用 1080

    更新记录 版本时间修订内容1 02018 3 28增加了方案二1 12019 8 9增加了方案三 问题的提出 实验环境 xff1a Win7 64bit 也许你会碰到以下错误 xff1a 本文给出2种解决方案 方案一 既然说端口已被占用 x
  • git cherry-pick 详解 —— Git 学习笔记 18

    git cherry pick 详解 初识 git cherry pick xff08 拣选 xff09 拣选会提取某次提交的补丁 xff0c 之后尝试将其重新应用到当前分支上 这种方式在你只想引入特性分支中的某个提交时很有用 假设你的项目
  • 问题解决: SSR 的 1080 端口被占用

    问题解决 xff1a SSR 的 1080 端口被占用 在我的博客 故障解决 xff1a 端口已被占用 1080 中已经讨论了一些方法 xff0c 但也不是每次都能成功 对于 SSR xff0c 我们完全可以换一种思路 xff1a 既然 1
  • USB开发简述

    由于工作需要 xff0c 接触了USB xff0c 经过这两三周的学习 xff0c 我只想说一句 xff0c 我们USB说简单也简单 xff0c 说复杂也有那么多知识 xff01 这怎么说呢 xff1f 简单 xff1a 无非就那几个结构体
  • 基于PX4六旋翼无人机百米悬停定点降落

  • 手把手教你实现ROS Melodic+Realsense D435i

    硬件配置 xff1a HP ProDesk 480 G6 MT 系统内存 xff1a 8G 处理器 xff1a Intel i7 8700 CPU 操作系统 xff1a Ubuntu 18 04 相机配置 xff1a Intel Reals
  • pixhawk调试过程中QGC报错显示问题及解决方案汇总

    1 室内环境下解锁无人机 xff0c 报错 xff1a Not arming geofence RTL requiers valid home 解决 xff1a 去掉安全设置里面的地理围栏 xff0c 否则只能在有GPS的环境下解锁
  • pixhawk4连接PX4 Flow光流传感器调试过程记录

    主控型号 Pixhawk4 光流型号 PX4 FLow V1 3 地面站 QGroundControl 1 拔掉PX4 Flow连接Pixhawk4的连接线 用USB连接PX4 Flow 打开QGC地面站 烧写固件 烧写完成后就可以在QGC
  • 使用Xshell连接Ubuntu主机失败

    1 问题 在将一台Ubuntu系统的电脑作为服务器 xff0c 使用Xshell连接时 xff0c 发生如下错误 此时使用ping工具检查是否能够ping通 说明能够连接上 xff0c 但是不能使用Xshell进行远程操作 2 解决方法 首
  • P900数传参数配置

    端口定义 xff1a xff08 从左往右 xff09 GND RX TX 5V 调试软件 xff1a X CTU 启动调试 xff1a 按住数传板上SW2 xff0c 同时按住SW1 xff0c 然后松开SW2 xff0c 再松开SW1
  • 利用ROS实现PX4 offboard板外控制

    基于ROS Melodic xff0c 以px4开发者手册实例程序为例 xff0c 实现gazebo下无人机起飞两米悬停 xff0c 具体操作分为三步 xff1a 1 创建工作空间 xff0c 建立offboard包 2 构建mavros
  • Jetson TX2开发板配置Intel T265环境的必要解决方式

    在Jetson TX2配置T265相关依赖时会发生错误 xff0c 因此需要提前对相关参数进行设置 xff0c 主要要将网络设置里面的相关参数改成下图的配置 xff1a
  • pixhawk日志ulg格式转matlab数据csv格式

    1 windows下打开Anconda Prompt xff0c 执行pip install pyulog安装pyulog包 2 在日志文件所在文件夹下执行ulog2csv 文件名 ulg即可生成相关的csv文件
  • 悲催的秋招之路

    个人情况 双非工科硕 民办本 专科起点 基础不行 专业知识不扎实 无技术无论文无项目 投递记录 企业名称 投递时间 岗位1 岗位2 岗位3 岗位4 国电南自 2021 5 19 嵌入式软件研发工程师 民生银行 2021 5 26 金融科技方
  • Matlab读取EXCEL文本中的数据并绘制二维三维曲线图脚本

    Matlab读取EXCEL文本中的数据并绘制二维三维曲线图需要将EXCEL保存为CSV格式 xff0c 然后取数据成矩阵进行处理 转CSV的方式 xff1a pixhawk日志ulg格式转matlab数据csv格式 1 导入文件 span
  • 零基础教会你用github创建个人博客网站

    1 创建账号 进入github网站 xff0c 在网站首页右上角进行用户注册 2 填写相关信息 按照提示填写相关信息完成用户注册 3 搭建个人博客库 进入个人主页 xff0c 在右上角选择 43 好 xff0c 进入 new reposit
  • SV2-4G移动终端使用配置与使用

    一 硬件连接 1接位置天线 xff0c 2接方向天线 xff0c 3接4G天线 xff0c 4接GPS配置专用线 xff0c 5接4G配置专用线 二 运行状态识别 1处为指示灯 xff08 运行 SIM卡 网络 电源 xff09 xff0c
  • yapi插件开发及安装的一些备注

    yapi官方文档有些缺失 xff0c 这里做一下补充 xff0c 官方文档地址 xff1a https hellosean1025 github io yapi documents redev html 插件开发需要调试 xff0c 这个需
  • VSCode修改编辑器(代码窗口)背景色

    VSCode 的背景色是放在主题里面定义的 xff0c 所以在vscode的设置中无法修改到编辑器也就是代码窗口的背景色 xff0c 对应想要自定义编辑器背景的同志们来说 xff0c 可以通过修改主题文件来实现 xff0c 操作起来也并不复
  • ros下tcp通信的过程

    ros框架下的tcp通信的过程 博主在编写一个需要通过wifi传输两个整数和一个状态的问题中 xff0c 通过构建ros xff08 Ubuntu16 04 框架下的tcp c 43 43 通信过程解决了问题 一 ros串口通信的实现 首先

随机推荐

  • Ecos操作系統查看进程信息

    由于最近公司用到了ecos操作系统 xff0c 所以简单的了解了一下这个RTOS xff0c 其相关的社区资源较少 xff0c 国内基本不用 xff0c 这里结合手册整理了一部分的内容 本文章主要两部分 xff0c 一是建立基本的测试进程
  • 在vmware上运行ecos

    目前关于在vmware虚拟机上运行ecos的文章应该是有 xff0c 我会放到文章最后面的资源链接 xff0c 所以写这篇文章的目的有两点 xff0c 一是补充原有文章的不足 xff0c 在实际操作中遇到的困难 二是提供其中相关的资源链接
  • PROFINET协议解析-DCP

    目录 一 设置 Set xff08 请求 xff09 二 设置Set xff08 应答 xff09 三 识别 Identify xff08 请求 xff09 四 识别 Identify xff08 应答 xff09 DCP全称Discove
  • PROFINET协议-DCP实践

    这里就上篇文章 Profinet协议解析 DCP 内容进行实践 xff0c 通过实验验证各操作的准确性 xff0c 并且也介绍一些基本的通信分析方法 xff0c 不必使用昂贵的抓包工具 xff08 某东200左右 xff09 xff0c 使
  • Profinet协议解析-过程数据

    新的一篇文章 xff0c 开始讲下一个点 过程数据 过程数据 xff0c 顾名思义 xff0c 就是一直循环传输的数据 xff0c 在整个过程中不间断的传输 xff0c 其每次传输的时间称为同步周期 这点类似于Ethercat中的PDO数据
  • 无题

    漫无目的的写点东西 很多事情在文字面前显得特别无力 xff0c 又不得不用它来描述记录 记得读本科那会儿 xff0c 机械专业被称为一个万金油的行业 xff0c 所以宁愿用一本的分数去一个二本学校 xff0c 也要报机械专业 xff0c 谁
  • PROFINET的时钟同步(一)

    最近发现CSDN的编辑工具越来越不好用了 xff0c 直接用word导出PDF转图片 xff0c 发上来 清晰度受CSDN的影响 xff0c 不是很清楚
  • PROFINET 链路简述

    如上为 Profinet 的简易收发链路图 xff0c 其中收发各有四条路径 xff0c 三个中继桥 租用分别如下 xff1a RX 端 xff1a CTRL xff1a 控制管理帧的通道 xff0c 例如 LLDP 的邻居协议相关帧 xf
  • DSP中GPIO位域

    在TMS320F2812中 xff0c 对于程序中寄存器的名称是如何映射到物理地址的 xff0c 这里做一下详细的讲解 主要应用到三个文件 xff1a CMD h DSP28 GLobalVariableDefs c xff0c 其中CMD
  • 使用UART串口下调试CH376芯片

    CH376是文件管理控制芯片 xff0c 用于单片机系统读写U 盘或者SD 卡中的文件 CH376支持USB设备方式和USB主机方式 xff0c 并且内置了USB通讯协议的基本固件 xff0c 内置了处理Mass Storage海量存储设备
  • Ubuntu(arm)22.04配置清华源

    1 xff0c 清华源地址 地址 xff1a https mirror tuna tsinghua edu cn help ubuntu 2 xff0c 获取ubuntu arm 的源 ubuntu arm 要使用清华源中ubuntu po
  • DGUS调试笔记一

    0 串口的通讯配置 xff1a 在机器背面VHC86芯片有两个焊点 xff0c 若焊点短接 xff0c 即屏工作在TTL电平下 xff0c 默认出厂处于分离状态 xff0c 即RS232电平下 直接将DIN与232的TX相连 xff0c D
  • 使用HAL库函数建立STM32F2工程笔记

    一 建立一个新的文件夹 xff0c 新建三个文件夹User Driver Project xff0c 还可以加一个Doc存放工程的相关说明等等 1 将STM32F2xx的库函数 xff08 HAL函数库 xff09 中的Drivers文件夹
  • STM32伺服编码器接口

    在STM32的高级定时器和一般定时器中有Encoder interface mode xff08 编码器接口 xff09 xff0c TI1和TI2分别对应TIM CH1 和TIM CH2 通道 一 计数规则如下 xff1a 表55的是编码
  • STM32下调试CAN通信

    基本流程 xff1a 1 初始化CAN模块 xff1a 启用CAN时钟 配置CAN功能寄存器 xff08 包括位定时 xff0c 分频等等 xff09 配置CAN过滤器 打开中断 2 初始化I O口 启用GPIO时钟 打开CAN对应的GPI
  • JLINK固件修复

    0 开始前准备工具 1 SAM BA v2 12 exe 用于烧写固件 下载地址 xff1a http download csdn net detail hzt12345hf 9457629 新版本的SAM BA xff08 例如sam b
  • Keil4,Keil5下使用STlink II 仿真调试

    1 关闭Keil软件 2 下载以下压缩包STlink II相关文件 xff0c 包含三个文件ST LINKII KEIL dll xff0c StorAcc dll和TOOLS INI 3 将ST LINKII KEIL dll和StorA
  • Centos下PHP5升级PHP7

    首先下载PHP7安装包 xff0c 使用wget http am1 php net distributions php 7 2 0 tar bz2 或者直接访问下载 xff0c 然后ftp到linux服务器解压压缩包 xff0c tar x
  • STM32F1xx及STM32F2系列串口,SPI配置,CAN配置

    平时常用的串口和SPI配置在这里列出来 xff0c 以便不时之需 xff0c 直接拿过来用 同时指出了STM32F1系列和STM32F2系列经常出现的问题 使用的库函数为标准库函数 xff0c 而非HAL库 一 串口的配置 xff1a ST
  • 嵌入式中缓冲区队列的实现

    在串口 xff0c IIC或SPI以及CAN等通信中 xff0c 往往需要一次性发送一帧完整的数据 xff0c 由于硬件发送的速度问题 xff0c 硬件不能及时发送出去 xff0c 就会导致数据丢失等一系列问题 通常采用建立缓冲区解决 队列