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

做家务的男人网站长沙快速网页制作

做家务的男人网站,长沙快速网页制作,建设工程合同属于承揽合同吗,磁力屋 最好用HEX数据包的接收 研究几个小问题 1.包头包尾和数据载荷重复的问题 这里定义FF为包头,FE为包尾,如果我传输的数据本身就是FF和FE怎么呢?那这个问题确实存在,如果数据和包头包尾重复,可能会引起误判。我们有以下几种解…

HEX数据包的接收

image-20250428132219910

研究几个小问题

1.包头包尾和数据载荷重复的问题

这里定义FF为包头,FE为包尾,如果我传输的数据本身就是FF和FE怎么呢?那这个问题确实存在,如果数据和包头包尾重复,可能会引起误判。我们有以下几种解决方案:1.限制载荷数据的范围,如果可以的话, 我们可以在发送的时候, 对数据进行限幅。比如XYZ,3个数据,变化范围都可以是0100,那就好办了,我们可以在载荷中只发送0100的数据,这样就不会和包头包尾重复了 2.如果无法避免载荷数据和包头包尾重复,那我们就尽量使用固定长度的数据包,这样由于载荷数据是固定的,只要我们通过包头包尾对齐了数据,我们就可以严格知道,哪个数据应该是包头包尾,哪个数据应该是载荷数据,在接收载荷数据的时候, 我们并不会判断它是否是包头包尾,而在接收包头包尾的时候,我们会判断它是不是包头包尾,用于数据对齐。这样,在经过几个数据包的对齐之后,剩下的数据包应该就不会出现问题了。3.增加包头包尾的数量,并且让它尽量呈现出载荷数据出现不了的状态,比如我们使用FF、FE作为包头 ,FD、FC作为包尾,这样也可以避免载荷数据和包头包尾重复的情况发生。

2.这个包头包尾并不是全部都需要的,比如我们可以只要一个包头,把包尾删掉,这样数据包的格式就是,一个包头FF, 加4个数据,这样也是可以的, 当检测到FF 开始接收,收够4个字节后,置标志位, 一个数据包接收完成,不过这样的话,载荷和包头重复的问题会更严重一些,比如最严重的情况下,我载荷全是FF,包头也是FF,而加上了FE作为包尾,无论数据怎么变化,都是可以分辨出包头包尾的

3.就是固定包长和可变包长的选择问题,对应HEX数据包来说,如果你的载荷会出现和包头包尾重复的情况,那就最好选择固定包长,这样可以避免接收错误,如果你又会重复,又选择可变包长,那数据很容易就乱套了,如果载荷不会和包头包尾重复,那可以选择可变包长

4.各种数据转换为字节流的问题,这里数据包都是一个字节一个字节组成的,如果你想发送16位的整型数据,32位的整型数据,float double,甚至是结构体, 其实都没问题。因为它们内部其实都是由一个字节一个字节组成的,只需要用一个uint8_t的指针指向它,把它们当做一个字节数组发送就行了。

文本数据包的接收

image-20250428132239429

而在文本数据包里面,每个字节就经过了一层编码和译码,每个文本字符背后,其实都还是一个字节的HEX数据,对吧。在载荷数据中间可以出现除了包头包尾的任意字符,这很容易做到,所以文本数据包基本不用担心载荷和包头包尾重复的问题,使用非常灵活,可变包长 各种字母、符号、 数字,都可以随意使用。在软件中再对字符串进行操作和判断。就可以实现各种指令控制的功能了。而且,字符串数据包表达的意义很明显,可以把字符串数据包直接打印到串口助手上,什么指令、什么数据,一眼就能看明白。所以这个文本数据包,通常会以换行作为包尾,这样在打印的时候,就可以一行一行地显示了,非常方便,那HEX数据包和文本数据包这两种对比下来,其实也是各有优缺点,HEX数据包,优点是,传输最直接,解析数据非常简单,比较适合一些模块发送原始的数据,比如一些使用串口通信的陀螺仪、 温湿度传感器。缺点就是灵活性不足,载荷容易和包头包尾重复。文本数据包,优点是,数据直观易理解, 非常灵活,比较适合一些输入指令进行人机交互的场合。比如蓝牙模块常用的AT指令,CNC和3D打印机常用的G代码,都是文本数据包的格式,那缺点就是解析效率低,如果发送一个数100,HEX数据包就是一个字节100, 完事。文本数据包就得是3个字节的字符,‘1’,’0‘,’0‘,收到后还要把字符转换成数据,才能得到100。所以说,我们需要根据实际场景来选择和设计数据包格式。

数据包的收发流程

首先是数据包的发送,其实数据包的发送非常简单,不用说, 大家应该也都能想到,在HEX数据包这里,我如果想发送这样一个数据包,就定义一个数组, 填充数据,然后用上一小节我写过的SendArray,一发就完事了。文本数据包这里,也很简单,写一个字符串,然后调用SendString,一发送,也完事了。所以说,发送这个数据包是很简单的,因为发送过程完全是自主可控的,想发啥就发啥,我们写代码的时候也能感受到,串口发送, 比接收简单多了。

那接下来,接收一个数据包,这就比较复杂了。

我这里演示了固定包长HEX数据包的接收方法

image-20250428231718629

首先,根据之前的代码,我们知道,每收到一个字节,程序都会进一遍中断,在中断函数里, 我们可以拿到这一个字节,但拿到之后,我们就得退出中断了。所以,每拿到一个数据,都是一个独立的过程,而对于数据包来说,很明显它具有前后关联性,包头之后是数据, 数据之后是包尾,对于包头,数据和包尾这3种状态,我们都需要有不同的处理逻辑,所以在程序中,我们需要设计一个能记住不同状态的机制,在不同状态执行不同的操作, 同时还要进行状态的合理转移,这种程序设计思维,就叫做 “状态机”。在这里我们就使用状态机的方法来接收一个数据包,要想设计一个好的状态机程序,画一个这样的状态转移图是必要的,对于上面这样一个固定包长HEX数据包来说,我们可以定义3个状态,第一个状态是等待包头,第二个状态是接收数据,第三个状态是等待包尾,每个状态需要用一个变量来标志一下,比如我这里用变量S来标志,三个状态依次为S=0、S=1、S=2,这一点类似于置标志位,只不过标志位只有0和1,而状态机是多标志位状态的一种方式。然后执行流程是,最开始,S=0;收到一个数据进中断,根据S=0,进入第一个状态的程序,判断数据是不是包头FF,如果是FF,则代表收到包头,之后置S=1,退出中断,结束。这样下次再进中断,根据S=1,就可以进行接收数据的程序了,那在第一个状态,如果收到的不是FF,就证明数据包没有对齐,我们应该等待数据包包头的出现,这时状态就仍然是0,下次进中断,就还是判断包头的逻辑,直到出现FF,才能转到下一个状态,那之后,出现了FF,我们就可以转移到接收数据的状态了,这时再收到数据,我们就直接把它存在数组中,另外再用一个变量,记录收了多少个数据,如果没收够4个数据,就一直是接收状态,如果收够了,就置S=2,下次进中断时,就可以进入下一个状态了,那最后一个状态就是等待包尾了,判断数据是不是FE,正常情况,应该是FE,这样就可以置S=0 回到最初的状态,开始下一个轮回,当然也有可能,这个数据不是FE,如数据和包头重复, 导致包头位置判断错了,那这个包尾位置就有可能不是FE,这时就可以进入重复等待包尾的状态,直到接收到真正的包尾,这样加入包尾的判断,更能预防因数据和包头重复造成的错误,这就是使用状态机接收数据包的思路,这个状态机其实是一种很广泛的编程思路。

可变包长文本数据包的接收方法

image-20250506225358108

第一个状态,等待包头,判断收到的是不是我们规定的@符号,如果收到@,就进入接收状态,在这个状态下, 依次接收数据,同时,这个状态还应该要兼具等待包尾的功能,因为这是可变包长,我们接收数据的时候, 也要时刻监视,是不是收到包尾了,一但收到包尾了,就结束,那这里,这个状态的逻辑就应该是,收到一个数据,判断是不是\ r,如果不是,则正常接收,如果是,则不接收, 同时跳到下一个状态,等待包尾\ n,因为我这里数据包有两个包尾\r,\n,所以需要第三个状态,如果只有一个包尾, 那在出现包尾之后,就可以直接回到初始状态了,只需要两个状态就行,因为接收数据和等待包尾需要在一个状态里同时进行,由于串口的包头包尾不会出现在数据中,所以基本不会出现数据错位的现象,这就是使用状态机接收文本数据居包的方法。


文章转载自:

http://J3GFuKsS.fmkjx.cn
http://mYgHmXS4.fmkjx.cn
http://41thvbHC.fmkjx.cn
http://bWDjladv.fmkjx.cn
http://jiyCSBPL.fmkjx.cn
http://pbRKtV4e.fmkjx.cn
http://nHlydylZ.fmkjx.cn
http://oMiXqkFN.fmkjx.cn
http://QMjTftU0.fmkjx.cn
http://nd5PVzwC.fmkjx.cn
http://I40irA75.fmkjx.cn
http://lirlteCb.fmkjx.cn
http://glsJ6KYm.fmkjx.cn
http://OThkjtsn.fmkjx.cn
http://9AS5gA4a.fmkjx.cn
http://Ad3OoH8w.fmkjx.cn
http://nroQokRO.fmkjx.cn
http://OoLP6HB2.fmkjx.cn
http://MaFZu3yZ.fmkjx.cn
http://hzSXCnsg.fmkjx.cn
http://sdSM3HrV.fmkjx.cn
http://VH31EA4i.fmkjx.cn
http://Hy0NM6Aa.fmkjx.cn
http://ksxa5p6r.fmkjx.cn
http://4qKdm7UZ.fmkjx.cn
http://UeY50aac.fmkjx.cn
http://QUX4Pvln.fmkjx.cn
http://vMA4TuVd.fmkjx.cn
http://bT0JPDDi.fmkjx.cn
http://6rrPpHGf.fmkjx.cn
http://www.dtcms.com/wzjs/679719.html

相关文章:

  • 用KEGG网站做KEGG富集分析wordpress增加阅读
  • 网站初期推广方案合肥做双语网站
  • 创意网站建设设计公司网络seo招聘
  • 浦西网站建设做网站资料准备
  • 网站开发建设兼职如何制作钓鱼网站
  • 培训网站导航西陆网
  • 韩国时尚网站欣赏湘潭网站建设方案费用
  • 营销型网站 易网拓姜堰 做网站
  • 安徽省城乡和建设厅网站注册网站邮箱发送的验证网页无法打开
  • 淘宝网站怎么做的好坏wordpress vps 256m
  • 沈阳世纪兴网站制作君临天下游戏网站开发者
  • 网站推广都有哪些网络设计工程师是做什么的
  • 微信小程序制作网站桃源县建设局网站
  • 大连 建网站qq注册账号免费申请
  • 百度联盟添加网站阿里网站建设需要准备什么软件
  • 哈尔滨网站建设网站制作服务公司经营范围
  • 古典风格网站模板wordpress 食谱主题
  • 怎么来维护已经上传的网站呢局域网网站建设需要什么条件
  • 怎么样做网站视频公司部门简称
  • 人像摄影网站百度权重域名
  • 网站开发的税率是多少钱pc网站开发工具
  • 网站优化无限关键词设置wordpress做的网站
  • 个人网站效果图咋做中国新闻最新消息大事件
  • 南宁建设信息网站如何建立网站快捷方式到桌面
  • 深圳罗湖网站开发wordpress apache 404
  • 网站开发主管岗位职责说明书说说刷赞网站推广
  • 济南网站建设及推广站长工具亚洲
  • 软装设计网站排名教育培训网站
  • 彩票网站建设服务网站如何做快捷支付接口
  • 大庆网站开发制作宁国网站建设