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个字节的数据,该分配几个扇区?

我相信你已经有答案了~

审核编辑 :李倩


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

    关注

    5062

    文章

    18984

    浏览量

    302385
  • ZigBee
    +关注

    关注

    158

    文章

    2268

    浏览量

    242450
  • C语言
    +关注

    关注

    180

    文章

    7596

    浏览量

    135961

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

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

收藏 人收藏

    评论

    相关推荐

    什么是嵌入式?一文读懂嵌入式主板

    在现代科技浪潮中,嵌入式技术已成为支撑各种智能设备和系统运行的核心力量。那么,究竟什么是嵌入式嵌入式系统,顾名思义,是将计算机的硬件和软件嵌入到某种设备或系统中,以实现特定功能的计算
    的头像 发表于 10-16 10:14 428次阅读

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被称为嵌入式系统的核心组件,是一种用于控制和数据处理的计算机硬件,其设计旨在嵌入特定设备中执行专门任务。嵌入式主板如同是设备
    的头像 发表于 09-30 10:05 328次阅读

    嵌入式常用数据结构有哪些

    嵌入式编程中,数据结构的选择和使用对于程序的性能、内存管理以及开发效率都具有重要影响。嵌入式系统由于资源受限(如处理器速度、内存大小等),因此对
    的头像 发表于 09-02 15:25 367次阅读

    嵌入式系统是什么?

    含软件运行环境以及操作系统,硬件部分包含信号处理器、存储器以及通信模块等多方面内容。与传统的计算机系统相比,嵌入式系统与之相差很大,它并不能实现大容量的存储功能,软件部分则以API接口
    的头像 发表于 08-29 16:26 309次阅读

    嵌入式开发前景怎么样?

    嵌入式开发前景非常广阔,这主要得益于物联网、人工智能、大数据等技术的快速发展,以及嵌入式系统在各个领域的广泛应用。以下是对嵌入式开发前景的详
    的头像 发表于 07-10 09:00 2404次阅读
    <b class='flag-5'>嵌入式</b>开发前景怎么样?

    如何提升嵌入式编程能力?

    、SPI、CAN、WIFI、MQTT等多种通信协议。 4. 使用开发工具:熟练掌握嵌入式开发工具,如编译器、调试器、仿真器和实时操作系统(RTOS)。 5. 阅读数据手册:仔细阅读你所使用的微控制器或
    发表于 06-21 10:01

    嵌入式系统软硬件基础知识大全

    两部分组成的。硬件部分包括处理器、存储器、输入输出等,是嵌入式系统实现功能的基础。软件部分则包括操作系统、驱动程序、应用程序等,负责控制硬件组件的工作和实现各种功能。嵌入系统的硬件和软件是相互依存、相互
    发表于 05-09 14:12

    嵌入式系统的外设器件选择

    ,都可视系统的实际需求来进行选择。本文将为您介绍上述外设器件的类型与选择的考虑要素。 存储器的种类众多且特性不同 存储器 在嵌入式系统中,[存储器]是一个关键的器件,它用于存储程序代码、数据以及系统执行所需的其他信息。除了微控
    的头像 发表于 05-05 09:38 811次阅读
    <b class='flag-5'>嵌入式</b>系统的外设器件选择

    嵌入式主板,你了解多少?

    本文中,我们将讨论什么是嵌入式主板、它的组件以及它在嵌入式系统中的功能。 嵌入式主板的组件 嵌入式主板由多个关键部件组成,每个部件对其整体功
    的头像 发表于 04-17 15:11 1395次阅读

    嵌入式fpga是什么意思

    嵌入式FPGA是指将FPGA技术集成到嵌入式系统中的一种解决方案。嵌入式系统是一种为特定应用而设计的计算机系统,它通常包括处理器、内存、外设接口等组件,并且被嵌入到更大的设备或系统中,
    的头像 发表于 03-15 14:29 1172次阅读

    fpga是嵌入式

    FPGA(现场可编程门阵列)不是嵌入式系统,但FPGA在嵌入式系统中有着重要的应用。
    的头像 发表于 03-14 17:19 2108次阅读

    嵌入式软件设计的原则分享

    嵌入式软件开发如果具有更好的阅读性、扩展性以及维护性,就需要考虑很多因素。今天给大家分享几个嵌入式软件设计的原则。
    发表于 02-25 10:54 633次阅读
    <b class='flag-5'>嵌入式</b>软件设计的原则分享

    嵌入式软件开发应该掌握哪些知识?

    掌握的知识 1.基础知识 1.1 c/c++编程语言和数据结构 C/C++ 是嵌入式系统中常用的编程语言,因为它们提供了直接访问硬件的能力。通过使用特定的编译器和调用硬件相关的接口,可以实现对各种外设
    发表于 02-19 11:23

    嵌入式学习步骤

    开发。 嵌入式学习步骤总结如下: (1).确定目标平台:选择适合您要开发的嵌入式系统的硬件平台。这取决于您要控制的设备以及您需要执行的任务。 (2).选择编程语言:嵌入式系统通常使用C
    发表于 02-02 15:24

    什么是嵌入式系统?嵌入式系统的具体应用

    嵌入式,一般是指嵌入式系统。用于控制、监视或者辅助操作机器和设备的装置。
    的头像 发表于 12-20 13:33 2355次阅读