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

嵌入式开发之串行数据处理

前题

        前面几篇文章写了关于嵌入式软件开发时,关于串行数据处理的一些相关内容,有兴趣的可以看看《嵌入式开发:软件架构、驱动开发与串行数据处理》、《嵌入式软件开发之生产关系模型》和《嵌入式开发之Modbus-RTU协议解析》相关的内容。从业十几年,深刻感觉到在当前计算机和单片机的架构下,处理好串行数据,将大大提升软件运行的稳定性。

概述

        在物联网设备开发过程中,我们可以发现不管是采集传感器数据,还是和服务器进行通讯,涉及到交互的地方,设备间的数据都是以串行的方式进行交互的。下面以读取Modbus-RTU传感器的数据为例,报文格式如下:

        设备处理器以MCU为例,基于RS485总线进行交互,设备会将打包好的数据放入UART的发送寄存器,一次发送一个字节,首先发送0x01,然后依次发送完成这8个字节的数据,现在应用中一般是轮询发送(有数据发送时不停判断发送寄存器是否为空,为空时将要发送的数据继续放入,直到所有数据都发送完),中断接收(当接收完一个字节数据时产生中断,应用程序将接收寄存器中的数据保存下来)。发送的过程中有可能被中断,也有可能被干扰,数据有可能会产生错误码。发送时串口是轮询模式,相当于独占了MCU的资源,如果RAM足够大的话也可以采用中断发送的模式,创建一个发送的环形队列,需要发送的数据放入环形队列后,触发发送中断,发送完成后如果队列中还有数据就继续发送并触发中断,直到最后一个数据发送完成,这个在这里不展开讲了,这里只说处理数据的过程。

       接收数据也是在初始化串口时候创建了一个环形队列,产生接收中断时就将数据放入环形队列中,这里也多说一句,老工程师在写代码时,经常就是一个buf存放数据,在中断中判断超时,如果超时了就从中断中推出来,然后去解析buf里的数据,以前的设备处理的功能比较简单,功能也比较单一,这么做不会影响啥,但是现在的设备串口上挂着很多设备,比如我们的产品,有一个串口挂着蓝牙通信,一个串口挂着4G通信,一个串口挂着串口屏,再加上这个挂传感器的串口,如果一个串口停在中断里,其它的串口都有可能会丢数,问题会比较严重。

        串口中断只负责接收数据,相当于这个系统的数据生产者,它不管其他模块去怎么消费这些数据。

        创建一个任务,间隔性的查询环形队列里是否有数据,满足最小报文的长度,当满足报文长度时开始解析,解析时如果队列前面有无效字节,需要删除无效字节数,然后解析出完整的报文,并将完整的报文提取后进行处理,等下一个周期再去检查是否接收了完整的数据包,环形队列的长度一般要能够满足两三条报文的长度,这样避免粘包出现时,新数据将老数据冲掉。

        解析串行数据需要考虑断包,粘包,校验错误等问题。在利用生产关系模型将其结构化后,这些问题会很好解决。

        串行数据开始解析时,先从缓存中预提取一定长度数据出来,然后开始找报文头,确定报文头后就可以将报文头前面无效字节删除,然后提取报文长度,计算报文校验,这里比较关键如果报文长度有问题时,比如长度非法或者长度不够一包数据时,如何处理?长度非法的情况下需要删掉报文头一个字节,重新开始查找报文头。如果报文长度不够,就不做任何处理,退出循环,再次判断环形队列的长度,待长度满足最小报文长度时继续解析处理。以此类推,解析数据不一定要在一个循环里完成,要考虑在多次循环重入时怎么解决问题。这样做的另外一个好处就是会增强系统的实时性,尽量缩短单次循环处理数据的周期,能让大循环的周期尽量的短。

下面提供一组环形队列处理的接口定义,仅供参考,有兴趣可以发邮件或者留言交流一下:

int32_t fifo_init(fifo_t *pfifo,uint8_t *buf,uint32_t size);
int32_t fifo_get_free_size(fifo_t *pfifo);
int32_t fifo_get_data_size(fifo_t *pfifo);
int32_t fifo_del_data(fifo_t *pfifo,uint32_t size);
int32_t fifo_read(fifo_t *pfifo,uint8_t *buf,uint32_t len);
int32_t fifo_pre_read(fifo_t *pfifo,uint8_t *buf,uint32_t len);
int32_t fifo_write(fifo_t *pfifo,const uint8_t *buf,uint32_t len);

相关文章:

嵌入式开发之串行数据处理

前题 前面几篇文章写了关于嵌入式软件开发时,关于串行数据处理的一些相关内容,有兴趣的可以看看《嵌入式开发:软件架构、驱动开发与串行数据处理》、《嵌入式软件开发之生产关系模型》和《嵌入式开发之Modbus-RTU协议解析》相关的内容。从业十…...

深入解析 JVM —— 从基础概念到实战调优的全链路学习指南

文章目录 一、为什么要学习 JVM?1. 面试必备与技能提升2. 性能优化与问题诊断3. 编写高质量代码 二、JVM 基础概念与体系结构1. JVM 简介2. JDK、JRE 与 JVM 三、JVM 内存模型1. 线程私有区2. 线程共享区 四、类加载机制与双亲委派1. 类加载过程2. 双亲委派模型3. 动…...

LTC6804、LTC6811、LTC6813的使用

FSEC自制BMS第一步:从零开发使用LTC6804采集电池电压 LTC6811特性 LTC6811 是 LTC6804 的引脚兼容型升级器件,LTC6804官方已经不推荐选用 可测量多达 12 节串联电池 1.2mV 最大总测量误差 可堆叠式架构能支持几百个电池 内置 isoSPI™ 接口 可在 290μ…...

Spring 构造器注入和setter注入的比较

一、比较说明 在 Spring 框架中,构造器注入(Constructor Injection)和 Setter 注入(Setter Injection)是实现依赖注入(DI)的两种主要方式。它们的核心区别在于依赖注入的时机、代码设计理念以及…...

【LangChain】对话历史管理

1 历史记录的剪裁 trimmed_messages from langchain_core.messages import (AIMessage,HumanMessage,SystemMessage,trim_messages, ) from langchain_openai import ChatOpenAImessages [SystemMessage("youre a good assistant, you always respond with a joke."…...

【无人机三维路径规划】基于CPO冠豪猪优化算法的无人机三维路径规划Maltab

代码获取基于CPO冠豪猪优化算法的无人机三维路径规划Maltab 基于CPO冠豪猪优化算法的无人机三维路径规划 一、CPO算法的基本原理与核心优势 冠豪猪优化算法(Crested Porcupine Optimizer, CPO)是一种新型元启发式算法,其灵感来源于冠豪猪的…...

CAN协议介绍

目录 一、CAN协议 1.1 CAN协议简介 1.2 CAN物理层 1.3 CAN协议层 二、CAN控制器 2.1 CAN控制内核 2.2 CAN发送邮箱 2.3 CAN接收FIFO 2.4 CAN验收筛选器 一、CAN协议 1.1 CAN协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生…...

树莓派 Interface Option 中没有camera选项

最近重温树莓派的视觉,烧录了树莓派的新系统后发现在 raspi-config 中的 Interface Option 没有 camera 选项,同时在终端用 vcgencmd get_camera 查看摄像头时没有检测到树莓派的 CSI 摄像头,在 Thonny 中调用树莓派摄像头出现报错&#xff1…...

大数据学习(55)-BI工具数据分析的使用

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…...

轻松上手 —— 通过 RPM 包快速部署 NebulaGraph

前言 在当今大数据时代,处理复杂关系数据的需求与日俱增,图数据库应运而生并逐渐崭露头角。NebulaGraph 作为一款高性能、分布式且易扩展的图数据库,专为应对大规模图数据处理而精心打造。它不仅具备丰富的查询语言,还拥有强大高效…...

nginx作为下载服务器配置

一、Nginx 作为下载服务器配置笔记 基本配置指令 server块配置: 在 Nginx 的配置文件(通常是/etc/nginx/nginx.conf或在/etc/nginx/conf.d/目录下的特定配置文件)中,首先需要定义一个server块来监听特定的端口并处理下载请求。例如…...

第六课:数据存储三剑客:CSV/JSON/MySQL

在Python的数据存储与处理领域,CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用,无论是简单的数据交换、轻量级的数据存储,还是复杂的关系型数据库管理,都能找到它们的身影。本文将详…...

Dify 开源大语言模型应用开发平台使用(一)

文章目录 一、创建锂电池专业知识解答应用1.1 应用初始化二、核心功能模块详解2.1 知识库构建2.2 工作流与节点编排节点类型说明工作流设计示例:锂电池选型咨询2.3 变量管理三、测试与调试3.1 单元测试3.2 压力测试3.3 安全验证四、部署与优化建议4.1 部署配置4.2 持续优化结论…...

PyQt高亮代码

PyQt高亮代码 安装 Pygments支持的格式支持的样式详解参考 Qt中使用 安装 Pygments Pygments 是Python中的一个高亮代码的包,挺好用的 pip install Pygments支持的格式 支持的格式比较多,不列出来了 # coding:utf-8 from pygments.lexers import get_all…...

小白学Agent技术[1]

文章目录 课程地址Agent介绍原理架构任务规划记忆工具使用程序开发范式的变化Agent开发注意事项 课程地址 Agent课程地址 Agent介绍 AI Agent(人工智能代理、AI智能体),一种模拟人类智能行为的人工智能系统,以大模型语言&#…...

以商业思维框架为帆,驭创业浪潮前行

创业者踏入商海,如同航海家奔赴未知海域,需有清晰的思维罗盘指引方向。图中“为什么—用什么—怎么做—何人做—投入产出”的商业框架,正是创业者破解商业谜题的密钥,从需求洞察到落地执行,为创业之路铺就逻辑基石。 …...

开源宝藏 Tigshop,开启电商新征程

在电商竞争愈发激烈的当下,一个强大且适配的商城系统是商家制胜的法宝。 Tigshop官网:Tigshop官网 - 开源商城系统Tigshop开源商城系统,支持b2b2c、多商户、多店铺、商家入驻、分销系统、跨境电商、连锁商城等解决方案,免费下载&…...

java多线程实现方式

目录 1. 继承 Thread 类 2. 实现 Runnable 接口 3. 实现 Callable 接口 4. 使用线程池 5. 使用 CompletableFuture(Java 8) 6. 使用 ForkJoinPool(Java 7) 7. 使用 Timer 和 TimerTask 8. 使用 ScheduledExecutorService …...

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目录 1. git update-git-for-windows 报错2. 解决方案2.1. 更新 CA 证书库2.2. 使用 SSH 连接(推荐)2.3 禁用 SSL 验证(不推荐) 1. git update-git-for-windows 报错 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…...

python:pymunk + pygame 模拟六边形内小球弹跳运动

向 chat.deepseek.com 提问:编写 python 程序,用 pymunk, 有一个正六边形,围绕中心点缓慢旋转,六边形内有一个小球,六边形的6条边作为墙壁,小球受重力和摩擦力、弹力影响,模拟小球弹跳运动&…...

vulnhub靶场之【digitalworld.local系列】的vengeance靶机

前言 靶机:digitalworld.local-vengeance,IP地址为192.168.10.10 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式&#xff…...

shiro550-cve-2016-4437复现

shiro550-cve-2016-4437 复现环境:docker desktop idea远程调试jdk版本必须与容器里的jdk1.8.0_102 匹配上,下载资源翻我CC1链那篇文章 注意burpsuite的proxy listeners端口改一下别跟docker容器的重了。 ysoserial工具:https://github.c…...

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)

文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤(Ollama方式)1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…...

Windows 版本Nmap使用报错“无法打开device eth0”

背景 使用nmap在win10上进行扫描工作正常,换到win server 2012 r2以后,扫描报错“无法打开device eth0” 使用了重装、重启大法,未彻底解决 PS:这台服务器之前完装过wireshark,实际已经安装了npcap 解决步骤 查询了…...

java字符串

字符串构造 1.使用常量串构造 String h1 "hello";System.out.println(h1); 2.new对象 String h2 new String("hello");System.out.println(h2); 3.使用字符数组构造 char[] array {h,e,l,l,o};String h3 new String(array);System.out.println(h3);…...

Uniapp 页面返回不刷新?两种方法防止 onShow 触发多次请求!

目录 前言1. 变量(不生效)2. 延迟(生效) 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 在 Uniapp 中,使用 onShow() 钩子来监听页面显示&#xff0…...

鸿蒙生态日日新,夸克、顺丰速运、驾校一点通等多款应用功能更新

3月5日鸿蒙生态日日新PLOG:吉事办、健康甘肃等政务服务App上架原生鸿蒙应用市场;夸克、顺丰速运、驾校一点通等多款应用功能更新。...

库制作与原理

什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入…...

《量子Java:从超导芯片到光子计算的编程革命》——解析Google量子AI中心的混合架构,揭秘如何用Java控制量子比特!

标题:《量子Java:从超导芯片到光子计算的编程革命》——解析Google量子AI中心的混合架构,揭秘如何用Java控制量子比特! 引言:当Java代码撞上量子叠加态——Google量子AI中心的0.003秒奇迹 Google量子AI中心首次实现Java程序对1200量子比特光量子芯片的实时控制,仅耗时3毫…...

音频3A测试--AGC(自动增益)和NS(降噪)测试

一、测试前期准备 一台电脑:用于作为控制播放和录制数据; 一台音频处理器(调音台):控制每个通道播放的数据,如噪声、人工头、模拟设备B输入的数据、收集标准麦克风,设备A处理完成的数据; 四个高保真音响&…...

点云数据处理--splat转3dtiles

文章目录 处理流程简介核心功能实现数据读取与格式转换数据读取splat转gltf 点云数据分割定义四叉树递归生成3dtiles瓦片 生成tileset.json递归生成tileset.json计算box 主函数调用渲染 下一步工作性能优化渲染效果调优其他 源码地址: github 处理流程简介 基本流…...

deepseek使用记录18——艺术的追问

一 好的,基于前面学习结果,再写一篇有艺术美的文章 《美的起义》 凌晨四点的茶摊在电子支付二维码下苏醒,蒸腾的水汽中浮动着八百年前建盏的釉色。老板娘把栀子花插在共享单车车筐里,花瓣的弧度与北宋汝窑青瓷的冰裂纹暗合&…...

ArcGIS操作:13 生成最小外接矩阵

应用情景:筛选出屋面是否能放下12*60m的长方形,作为起降场候选点(一个不规则的形状内,判断是否能放下指定长宽的长方形) 1、面积初步筛选 Area ≥ 720 ㎡ 面积计算见 2、打开 ArcToolbox → Data Management Tools …...

Manus AI Agent 技术解读:架构、机制与竞品对比

目录 1. Manus 是什么? 1.1 研发背景 1.2 技术特点 1.3 工具调用能力 1.4 主要应用场景 2. Manus 一夜爆火的原因何在? 2.1 技术突破带来的震撼 2.2 完整交付的产品体验 2.3 生态与开源策略 3. Manus 与其他 AI Agent 的对比分析 3.1 技术架构…...

npm 执行安装报错

Fix the upstream dependency conflict, or retry this command with --force or --legacy-peer-deps to accept an incorrect (and potentially broken) dependency resolution. 原因​ 主要的原因是 npm7 以上的版本,新增了一个对等依赖的特性,在以…...

Django 模型的逆向工程

模型的逆向工程:通过 inspectdb 命令从数据库表创建 Django 模型 在Django开发中,模型(Model)是定义数据库结构的关键组件。通常,我们根据业务需求先设计模型,然后通过Django的迁移系统创建相应的数据库表…...

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题:启动wsl里的Ubuntu24报错 报错信息: 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件,并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息,请访…...

Electron:点击右键保存图片到本地

前期插件 前端请求后台的一种方法 npm install got -S用于获取ArrayBuffer文件类型 npm install image-type -S生成随机数 npm install randomstring -D增加右击事件 点击右击事件的时候加载菜单 const imageRightSave require("./ImageRightSave") // 创建右…...

C语言中0UL和1UL

0UL 表示 无符号长整型 0 1UL 表示 无符号长整型 1 如果不写UL后缀,系统默认为:int, 即,有符号整数。 数值常数分为:整型常数和浮点常数; 数值常数后缀不区分字母大小写; 1.整型常数的后缀&#xff1a…...

6. 机器人实现远程遥控(具身智能机器人套件)

1. 启动控制脚本 远程作到 Raspberry Pi 中,并运行以下脚本: conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登录笔记本电脑上,同时运行以下脚本: conda ac…...

C++ 学生成绩管理系统

一、项目背景与核心需求 成绩管理系统是高校教学管理的重要工具,本系统采用C++面向对象编程实现,主要功能模块包括: 学生信息管理(学号/姓名/3门课程成绩) 成绩增删改查(CRUD)操作 数据持久化存储 统计分析与报表生成 用户友好交互界面 二、系统架构设计 1. 类结构设计 …...

网络安全配置截图 网络安全i

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全:Cyber Security(网络空间安全) 网络空间有独立且相互依存的信息基础设施和网络组成,包括互联网、电信网、计算机系统、嵌入式处理器和控…...

Facebook营销自动化—— Python脚本 + 代理IP实现内容高效分发

目录 1. 引言:内容分发与Facebook营销的现状与痛点 2. 环境搭建与前期准备 2.1 开发环境与工具选择 2.2 获取代理IP 2.3 Facebook账号与开发者平台配置 3. Facebook内容分发的基本流程与策略 3.1 内容规划与策略制定 3.2 内容分发方式选择 3.3 风控与风险防…...

Centos的ElasticSearch安装教程

由于我们是用于校园学习,所以最好是关闭防火墙 systemctl stop firewalld systemctl disable firewalld 个人喜欢安装在opt临时目录,大家可以随意 在opt目录下创建一个es-standonely-docker目录 mkdir es-standonely-docker 进入目录编辑yml文件 se…...

香港地区上线独立多用户电商平台系统需要注意哪些问题

在香港地区上线独立多用户电商平台系统时,需结合本地化需求、技术架构、法律合规及用户体验等多方面因素,以下是需要注意的关键问题及建议: 一、技术架构与服务器部署 服务器配置与带宽选择 根据业务规模选择合适的香港服务器配置&#xff0…...

元宇宙展厅应用场景有哪些?

元宇宙展厅作为元宇宙技术的重要应用场景之一,正在彻底改变人们的展示、学习与交流方式。其应用场景主要包括以下几个方面: 一、企业展览与营销 产品展示:企业可以利用元宇宙展厅搭建虚拟展示空间,通过高精度的3D建模和虚拟现实技…...

XGBoost常见面试题(五)——模型对比

XGBoost与GBDT的区别 机器学习算法中 GBDT 和 XGBOOST 的区别有哪些? - 知乎 基分类器:传统GBDT以CART树作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题&#…...

如何在WPS中接入DeepSeek并使用OfficeAI助手(超细!成功版本)

目录 第一步:下载并安装OfficeAI助手 第二步:申请API Key 第三步:两种方式导入WPS 第一种:本地大模型Ollama 第二种APIKey接入 第四步:探索OfficeAI的创作功能 工作进展汇报 PPT大纲设计 第五步:我的使用体验(体验建议) …...

重学 Android 自定义 View 系列(十一):文字跑马灯剖析

前言 一个可以横向滚动和纵向滚动的自定义文字跑马灯View,支持水平和垂直滚动、多段文本展示、点击事件回调等功能。 该View 由 ScrollTextView,改版而来,效果如下: 1. 功能介绍 ScrollTextView 是基于 SurfaceView 的自定义视…...

Android硬件加速原理解析

Android硬件加速原理解析 一、核心思想 ‌GPU与CPU分工‌ 硬件加速的本质是将‌图形渲染任务从CPU转移到GPU‌,利用GPU的并行计算能力处理像素填充、矩阵变换等密集型图形操作‌12。CPU负责逻辑计算,GPU专注于图形处理,避免单一资源瓶颈‌57。 ‌图形计算优化‌ GPU通过‌专…...