0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式数据分包以及相关技巧

嵌入式情报局 来源:最后一个bug 2023-01-06 14:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前些天跟大家解释了如下代码:

		

offset=len/64+!!(len%64);

并且跟大家详细聊了一下其中的!!操作,然而这段代码的主要功能还是为了进行分包处理,既然是分包自然而然就会想到一种常用的分包处理方法,这也是本文的重点。

数据分包在嵌入式软件开发中算是一种非常常见的处理,其主要原因还是硬件上的各种限制,不得已而为之,特别是在通信协议的定制过程中尤为常见。

1

传输限制

玩过各种通信协议的朋友都知道,像非常多的通信方式都是以数据帧的形式来进行传递,不同的通信方式因各方面的因素又存在一个最大传输字节数的限制,考虑到稳定性、容错性等等对单次发送的数据长度进行限制,又或者所接收的设备其内存资源有限,不足以接收、处理过长的数据包。

zigbee这样的物理层每帧最大只能传输127个字节,通过每层不断的封包到应用层后每包才100个字节。当上层用户协议的数据包过大,无法一次性传输,就只能分包或者分组下发,最终接收方组包后解析提取数据。

2

分包设计的考虑

有些朋友该说了,我就不喜欢搞大包发送,使用短包,然后通过不同的标识进行不同数据位的定义,简单很多。

当然长包与短包并没有本质上的区别,其目的都是传输数据,但在实践的过程中还是会遇到居多处理上的区别:

数据的同步性方面:

比如当通信的设备转速超了,同时报了一个故障码,如果采用短包上传,很可能故障码和转速位于不同的数据包中,当数据包丢包或许是乱序,就会导致当接收到故障码的时候,此时超标的转速值已经丢失或者延时等,有概率不能准确获得故障时的超标转速。

而使用长包,只需要发送方能够保证打包的时候同步,那么接收方就可以同步获得相应的数据。

通信协议设计自由度方面:

在设计协议的时候,长包会更加的自由,大多数情况都不需要考虑大数据传输的占位问题,甚至在编码上直接copy结构体发送也是相当方便的。

3

计算包数问题

既然长包的设计相对比较方便。那分包处理是少不了的?

分包还不简单?

要发100个字节的数据,每次只能发15个,那发送7包就可以了,直接编码,代码如下:

SendPack=SendNum/PackNum;
if(SendPack%PackNum)SendPack++;

这算是常规操作,如果觉得有点难度,还要多敲敲代码。

一般用C语言比较久的朋友都想去简化这种操作,毕竟实现一个简单的功能需要两行代码,强迫症,忍不了~

就有了本文开头的!!处理方式,或者如下处理也是一样的:


		

#include #definePackNum(total,single)(total/single+((total%single)?1:0)) intmain(void) { printf("packNum:%d ",PackNum(100,15)); printf("packNum:%d ",PackNum(150,15)); printf("packNum:%d ",PackNum(200,15)); printf("packNum:%d ",PackNum(5,15)); printf("hellobug~ "); return0; }

仅仅只是秀了一下C语言的几个小技巧罢了,并没有实质性的改善。

很明显,本文的重点并不是介绍如上两种办法,而是如下更加高效的代码:


		

PackNum=(total+(singleNum-1))/singleNum;

对于一些以往没有使用的朋友或许有点懵,那bug菌这是唠叨几句:

该表达式主要是利用了取整的特性来达到+1的目的。

直接除单包个数,不能整除的情况,结果都会少1,比如10/6,应该是2包,而由于最终除法结果只能是1。

所以通过补偿(singleNum - 1)后,结果就分两种情况:

1、原本能够整除的数,补偿后无法整除,结果与之前一致;

2、原本不能够整除的数,其余数必然在【1~(singleNum- 1)】之间,所以补偿以后,其余数范围在【singleNum~(singleNum+ singleNum- 2),则其结果为整除部分+1。

与我们分包个数是一致的,相当巧妙。

4

扩展

这种方法不仅仅只是用于通信的分组中,把思维进一步泛化。

只要是类似分组的处理都可以使用该算法

比如内存的分区,flash的设计上都是一个扇区一个扇区的分布。

现在想分配整数个扇形区域用于存储某些数据,每一个扇区512个字节,存储2000个字节的数据,该分配几个扇区?

我相信你已经有答案了~

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20156

    浏览量

    328977
  • ZigBee
    +关注

    关注

    158

    文章

    2296

    浏览量

    249174
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144636

原文标题:嵌入式数据分包以及相关技巧

文章出处:【微信号:嵌入式情报局,微信公众号:嵌入式情报局】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式与FPGA的区别

    ,现在招聘的岗位虽然越来越多,但需要本科以上理工类相关专业才行,而大厂更是要985/211的相关专业的硕士,因此fpga的门槛很高,可替代性差; 如果是嵌入式与FPGA要选一个,个人是比较建议
    发表于 11-20 07:12

    嵌入式系统的定义和应用领域

    都采用了嵌入式系统。同样,军事及航天类产品如四轴飞行器、雷达和作战机器人也离不开嵌入式系统的支持。此外,家电类产品如数字电视、扫地机器人和智能家电,以及医疗电子类产品如生化分析仪和血液分析仪等,也都
    发表于 11-17 06:49

    盘点嵌入式就业所需要的技能有哪些?

    ,把握未来的职业机遇。 1.智能汽车行业: - 熟悉嵌入式编程语言,如C/C++、Python等。 - 掌握嵌入式系统设计与开发流程,了解汽车电子控制系统的基本原理。 - 具备良好的数据结构和算法
    发表于 08-11 15:43

    入行嵌入式应该怎么准备?

    知识: 一、C/C++编程C/C++是嵌入式系统开发中最常用的编程语言。熟练掌握C/C++语言将使你能够理解和编写底层驱动程序、操作系统以及与硬件交互的代码。对于嵌入式系统来说,效率和资源利用率
    发表于 08-06 10:34

    Linux嵌入式和单片机嵌入式的区别?

    : 单片机嵌入式 :开发环境相对简单,通常使用C语言或汇编语言进行编程,开发工具包括Keil、IAR等。 Linux嵌入式 :开发环境较为复杂,除了需要掌握C语言,还需要了解Linux操作系统的相关知识
    发表于 06-20 09:46

    嵌入式开发入门指南:从零开始学习嵌入式

    特定功能的计算机系统,广泛应用于智能家居、工业控制、医疗设备、车载系统等领域。 2. 学习嵌入式开发的前置知识熟悉C语言编程掌握基本的数据结构与算法了解数字电路与微控制器原理熟悉Linux操作系统
    发表于 05-15 09:29

    嵌入式适合自学吗?

    缺乏系统的规划,而学习到一些不相关或不重要的内容。 2)缺乏实践机会:嵌入式开发需要大量的实践,而自学的学习者可能缺乏实际的项目练习和实践机会。这会导致学习者在实际工作中缺乏经验,难以胜任嵌入式
    发表于 04-27 09:54

    嵌入式去哪个城市好?

    对于嵌入式技术从业者来说,选择哪个城市发展是一个重要的决策。以下是一些建议: 一线城市 北京作为中国的首都和科技中心,北京拥有众多顶尖的高校和研究机构,以及大量的高科技企业,为嵌入式开发和应用提供了
    发表于 04-02 10:12

    如何成为嵌入式开发工程师?

    如何成为嵌入式开发工程师? 成为嵌入式开发工程师通常需要掌握一系列技能和知识,并且在实践中不断积累经验。以下是一些基本步骤和建议: 1. 基础教育:- 获取电子工程、计算机科学或相关领域的学位
    发表于 02-19 10:39

    嵌入式机器学习的应用特性与软件开发环境

    设备和智能传感器)上,这些设备通常具有有限的计算能力、存储空间和功耗。本文将您介绍嵌入式机器学习的应用特性,以及常见的机器学习开发软件与开发环境。 嵌入式机器学习的应用特性与优势 由于嵌入式
    的头像 发表于 01-25 17:05 1220次阅读
    <b class='flag-5'>嵌入式</b>机器学习的应用特性与软件开发环境

    嵌入式主板的概述与发展

    随着科技的迅猛发展,嵌入式系统在现代电子产品中扮演着越来越重要的角色。嵌入式主板作为嵌入式系统的核心组件之一,承担着控制、处理和通讯等多种功能。本文将对嵌入式主板的基本概念、构成部分、
    的头像 发表于 01-13 16:30 1187次阅读
    <b class='flag-5'>嵌入式</b>主板的概述与发展

    哪些专业适合学习嵌入式开发?

    网络协议与标准,包括MQTT、CoAP以及HTTP等,适合物联网领域的数据交换和通信。 5)物联网工程:直接关联物联网领域,涉及嵌入式系统、网络通信、数据处理与分析等,适合物联网领域。
    发表于 01-03 13:44

    ARM架构嵌入式主板特点

    嵌入式主板可以理解为嵌入在设备中用于控制和数据处理的CPU板,也就是设备的“大脑”。当主板嵌入到设备中,当然对主板的体积和功耗会有更严格的要求(嵌入
    的头像 发表于 12-31 16:03 1846次阅读
    ARM架构<b class='flag-5'>嵌入式</b>主板特点

    嵌入式好找工作吗?

    ,也就意味着嵌入式相关岗位的需求量是持续且庞大的,不用担心短期内出现行业性的就业寒冬,能为从业者提供较为稳定的就业机会。 2.技术的不可替代性 嵌入式开发涉及到硬件和软件的深度融合,开发人员需要
    发表于 12-16 15:43

    新手怎么学嵌入式?

    基本的概念。嵌入式系统是一种将计算机技术嵌入到特定设备中的系统,它通常具有特定的功能和有限的资源。你需要学习一些计算机基础知识,如数据结构、操作系统、计算机组成原理等。这些知识将帮助你理解嵌入
    发表于 12-12 10:51