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

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

3天内不再提示

数据分包设计的考虑

Q4MP_gh_c472c21 来源:最后一个bug 作者:最后一个bug 2022-05-12 14:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,我是bug菌~前些天跟大家解释了如下代码:

		

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

我相信你已经有答案了~

审核编辑 :李倩

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

    关注

    8

    文章

    7315

    浏览量

    93997
  • 数据包
    +关注

    关注

    0

    文章

    269

    浏览量

    25425
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73159

原文标题:谈谈数据分包及相关小技巧

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    企业实施BI的时机和选择考虑

     在数聚股份看来,如果你的企业还只处在初创阶段,但又需要为日后的BI数据化做准备时。出于成本考虑,你可以先用Excel梳理好业务核心数据,聚焦核心指标,接着发展用户,积累业务数据。  
    的头像 发表于 12-02 16:08 129次阅读

    使用nrf54L15的NORDIC蓝牙芯片,通过串口发送一帧数据包时,会出现分包发送分析

    使用nrf54L15的NORDIC蓝牙芯片,通过串口发送一帧数据包时,会出现分包发送分析,是什么原因呢
    发表于 11-17 15:52

    加速度传感器需要考虑的五大因素

    在严苛和复杂的环境中研究、开发和测试产品时,加速度传感器能够提供宝贵的数据。但在某些行业,采集数据(特别是高g值下的测量)可能比较困难。因为加速度传感器的应用取决于其精确度,所以在决定采用何种加速度
    的头像 发表于 10-20 14:14 233次阅读
    加速度传感器需要<b class='flag-5'>考虑</b>的五大因素

    使用fal api 来读写1024 字节数据,需要需要考虑被高优先级线程打断吗?

    使用fal api 来读写1024 字节数据,需要需要考虑被高优先级线程打断吗?
    发表于 10-10 07:16

    FlashDB 的TSDB不支持写粒度为128,是出于什么考虑有这样的限制?

    FlashDB 的TSDB不支持写粒度为128,是出于什么考虑有这样的限制? 如果我希望把这个数据库移植到这样的一个mcu上,我们应该怎么做,有些建议吗。 感谢各位大佬指点。
    发表于 09-23 08:19

    ADC和FPGA之间LVDS接口设计需要考虑的因素

    本文描述了ADC和FPGA之间LVDS接口设计需要考虑的因素,包括LVDS数据标准、LVDS接口数据时序违例解决方法以及硬件设计要点。
    的头像 发表于 07-29 10:01 5029次阅读
    ADC和FPGA之间LVDS接口设计需要<b class='flag-5'>考虑</b>的因素

    选择锡丝直径的关键考虑因素

    锡丝的直径对于激光锡焊效果的影响非常大,如何选择合适的锡丝直径就显得非常重要。松盛光电来给大家介绍选择锡丝直径的关键考虑因素,来了解一下吧。
    的头像 发表于 04-24 10:54 650次阅读

    设计早期对EMC的考虑

    这些经验法则。结果,70%~90%的新设计都没有通过第一次 EMC 测试,从而使后期重设计成本很高,如果制造商延误产品发货日期,损失的销售费用就更大。为了以低得多的成本确定并解决问题,设计师应该考虑
    发表于 03-04 14:21

    村田电子考虑大规模并购!

    全球最大电容生产商日本村田制作所社长中岛规巨表示,公司正在考虑进行超过 1000 亿日元 (约 6.65 亿美元) 的并购,以推动公司成长。目标是在截至 2027 财年的中期计划期间内完成。 村田
    的头像 发表于 02-28 15:21 713次阅读

    驱动板的参数配置需要考虑哪些因素

    驱动板的参数配置是一个复杂且关键的过程,涉及多个方面。以下是一些主要的参数配置步骤和考虑因素。
    的头像 发表于 02-14 14:53 815次阅读

    AN-825: iCoupler隔离产品的电源考虑因素

    电子发烧友网站提供《AN-825: iCoupler隔离产品的电源考虑因素.pdf》资料免费下载
    发表于 01-15 16:33 0次下载
    AN-825: iCoupler隔离产品的电源<b class='flag-5'>考虑</b>因素

    AN-793: iCoupler隔离产品的ESD/闩锁考虑因素

    电子发烧友网站提供《AN-793: iCoupler隔离产品的ESD/闩锁考虑因素.pdf》资料免费下载
    发表于 01-13 15:09 0次下载
    AN-793: iCoupler隔离产品的ESD/闩锁<b class='flag-5'>考虑</b>因素

    用FT2232H结合MATLAB API DLL读取ADS1271数据,如何才能不丢数据

    我正在用FT2232H结合MATLAB API DLL读取ADS1271数据,配置FORMAT模式为SPI模式,FT2232H不支持GPIO沿触发,支持SPI。考虑过外加FPGA或者CPLD,但是
    发表于 01-13 06:04

    EE-208:考虑ADSP-21262 SHARC DSP

    电子发烧友网站提供《EE-208:考虑ADSP-21262 SHARC DSP.pdf》资料免费下载
    发表于 01-07 13:50 0次下载
    EE-208:<b class='flag-5'>考虑</b>ADSP-21262 SHARC DSP

    选择数字孪生厂商要考虑哪四点

    在选择数字孪生厂商时,企业需要考虑多方面因素以确保选择到最适合自身需求的合作伙伴。以下是四个关键方面,企业在选择数字孪生厂商时应着重考虑: 一、厂商的行业经验与技术能力 行业经验:厂商在相同或相邻
    的头像 发表于 12-18 11:39 451次阅读