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

网站加关键词网站备案以后怎么做

网站加关键词,网站备案以后怎么做,著名办公空间设计公司,安徽企业平台网站建设本节主要内容#xff1a; 如何去规定一个合理的数据包格式如何收发数据包 1. 数据包格式规定/定义 1.1 HEX 数据包定义 固定包长#xff0c;含包头包尾 可变包长#xff0c;含包头包尾 首先数据包的作用是把一个个单独的数据给打包起来#xff0c;方便我们进行多字节…本节主要内容 如何去规定一个合理的数据包格式如何收发数据包 1. 数据包格式规定/定义 1.1 HEX 数据包定义 固定包长含包头包尾 可变包长含包头包尾 首先数据包的作用是把一个个单独的数据给打包起来方便我们进行多字节的数据通信。我们之前学习了串口的代码发送一个字节接收一个字节都没问题但在实际应用中我们可能需要把多个字节打包为一个整体进行发送比如说我们有个陀螺仪传感器需要用串口发送数据到 STM32陀螺仪的数据比如 X 轴一个字节Y 轴一个字节Z 轴一个字节总共 3 个数据需要连续不断地发送当你像这样XYZXYZXYZ 连续发送的时候就会出现一个问题就是接收方它不知道这数据哪个对应 X哪个对应 Y哪个对应 Z因为接收方可能会从任意位置开始接收所以会出现数据错位的现象这时候我们就需要研究一种方式把这个数据进行分割把 XYZ 这一批数据分隔开分成一个个数据包这样再接收的时候就知道了数据包的第一个数据就是 X、第二个数据就是 Y第三个数据就是 Z这就是数据包的任务就是把属于同一批的数据进行打包和分割方便接收方进行识别那有关分割打包的方法可以自己发挥想象力来设计只要逻辑行得通就行。 比如我可以设计在这个 XYZXYZ 数据流中数据包的第一个数据也就是 X 的数据包它的最高位置 1其余数据包最高位都置 0当我接收到了数据之后判断一下最高位如果是 1那就是 X 数据然后紧跟着的两个数据就分别是 Y 和 Z这就是一种可行的分割方法。这种方法就是把每个数据的最高位当作标志位来进行分割的实际也有应用的例子比如 UTF8 的编码方式和这就是类似的不过它那个编码更高级一些感兴趣的话可以了解一下。 那本节我们主要讲的数据包分割方法并不是在数据的高位添加标志位这种方式因为这种方式破坏了原有数据使用起来比较复杂我们串口数据包通常使用的是额外添加包头包尾的这种方式比如我这里就列举了两种数据包格式第一种是固定包长含包头包尾也就是每个数据包的长度都固定不变数据包前面是包头后面是包尾第二种是可变包长含包头包尾也就是每个数据包的长度可以是不一样的数据包前面是包头后面是包尾。它们的数据包格式可以是用户根据需求自己规定的也可以是你买一个模块别的开发者规定的。 那本节规定是比如固定包长这里一批数据规定有 4 个字节在这 4 个字节之前加一个包头比如我定义 0xFF 为包头在 4 个字节之后加一个包尾比如我定义 0xFE 为包尾。那当我接收到 0xFF 之后我就知道一个数据包来了接着我再接收到的 4 个字节就当作数据包的第 1、2、3、4 个数据存在一个数组里最后跟一个包尾当我收到 0xFE 之后就可以置一个标志位告诉程序我收到了一个数据包然后新的数据包过来再重复之前的过程这样就可以在一个连续不断的数据流中分割出我们想要的数据包了这就是添加包头包尾实现数据分割打包的思路。 接着我们来研究几个问题 包头包尾和数据载荷重复问题 这里定义 FF 为包头FE 为包尾如果我传输的数据本身就是 FF 和 FE 怎么办呢那这个问题确实存在如果数据和包头包尾重复可能会引起误判。 对应这个问题我们有如下几种解决方法 限制载荷数据的范围如果可以的话我们可以在发送的时候对数据进行限幅比如 XYZ3 个数据变化范围都可以是 0~100那就好办了我们可以在载荷中只发送 0~100 的数据这样就不会和包头包尾重复了。如果无法避免载荷数据和包头包尾重复那我们就尽量使用固定长度的数据包这样由于载荷数据是固定的只要我们通过包头包尾对齐了数据我们就可以严格知道哪个数据应该是包头包尾哪个数据应该是载荷数据在接收载荷数据的时候我们并不会判断它是否是包头包尾而在接收包头包尾的时候我们会判断它是不是确实是包头包尾用于数据对齐。这样在经过几个数据包的对齐之后剩下的数据包应该就不会出现问题了。增加包头包尾的数量并且让它尽量呈现出载荷数据出现不了的状态比如我们使用 FF、FE 做为包头FD、FC 作为包尾这样也可以避免载荷数据和包头包尾重复的情况发生。 包头包尾并不是全部都需要的。 比如我们可以只要一个包头把包尾删掉这样数据包的格式就是一个包头 FF加 4 个数据这样也是可以的当检测到 FF开始接收收够 4 个字节后置标志位一个数据包接收完成这样也可以不过这样的话载荷和包头重复的问题会更严重一些比如最严重的情况下我载荷全是 FF包头也是 FF那你肯定不知道哪个是包头了而加上 FE 作为包尾无论数据怎么变化都是可以分辨出包头包尾的。 固定包长和可变包长的选择问题 对于 HEX 数据包来说如果你的载荷会出现和包头包尾重复的情况那就最好选择固定包长这样可以避免接收错误如果你又会重复又选择可变包长那数据很容易就乱套了如果载荷不会和包头包尾重复那可以选择可变包长数据长度像这样4 位、3 位、等等1 位、10 位来回任意变肯定都没问题。因为包头包尾是唯一的只要出现包头就开始数据包只要出现包尾就结束数据包这样就非常灵活了。 各种数据转换为字节流的问题 这里数据包都是一个字节一个字节组成的如果你想发送 16 位的整型数据、32 位的整型数据、float、double、甚至是结构体其实都没问题因为它们内部其实都是由一个字节一个字节组成的只需要用一个 uint8_t 的指针指向它把它们当作一个字节数组发送就行了。 1.2 文本数据包定义 固定包长含包头包尾 可变包长含包头包尾 文本数据包和 HEX 数据包就分别对应了文本模式和 HEX 这两种模式。在 HEX 数据包里面数据都是以原始的字节数据本身呈现的而在文本数据包里面每个字节就经过了一层编码和译码最终表现出来的就是文本格式但实际上每个文本字符背后其实都还是一个字节的 HEX 数据。 那我们看一下同样给出了固定包长和可变包长这两种模式由于数据译码成了字符形式这就会存在大量的字符可以作为包头包尾可以有效避免载荷和包头包尾重复的问题。比如本节规定以 这个字符作为包头以 \r\n 也就是换行这两个字符作为包尾在载荷数据中间可以出现除了包头包尾的任意字符这很容易做到所以文本数据包基本不用担心载荷和包头包尾重复的问题使用非常灵活。可变包长、各种字母、符号、数字都可以随意使用当我们接收到载荷数据之后得到的就是一个字符串在软件中再对字符串进行操作和判断就可以实现各种指令控制的功能了。而且字符串数据包表达的意义很明显可以把字符串数据包直接打印到串口助手上什么指令什么数据一眼就能看明白所以这个文本数据包通常会以换行作为包尾这样在打印的时候就可以一行一行地显示了非常方便。 那 HEX 数据包与文本数据包这两种对比下来其实也是各有优缺点的。 HEX 数据包 优点传输最直接解析数据非常简单比较适合一些模块发送原始的数据。比如一些使用串口通信的陀螺仪、温湿度传感器。缺点灵活性不足、载荷容易和包头包尾重复。 文本数据包 优点数据直观易理解非常灵活比较适合一些输入指令进行人机交互的场合比如蓝牙模块常用的 AT 指令CNC 和 3D 打印机常用的 G 代码都是文本数据包的格式。缺点解析效率低。比如发送一个数 100HEX 数据包就是一个字节 100完事文本数据包就得是 3 个字节的字符‘1’‘0’‘0’收到之后还要把字符转换成数据才能得到 100。所以说我们需要根据实际场景来选择和设计数据包格式。 2. 数据包的收发流程 2.1 数据包的发送 数据包的发送非常简单。 在 HEX 数据包这里我如果想发送一个数据包就定义一个数组填充数据然后用上节我们写过的 SendArray 一发就完事了。 在 文本 数据包这里我如果想发送数据包就写一个字符串然后调用 SendString 一发送也完事了。 数据包的发送非常简单。因为发送过程是完全自主可控的想发啥就发啥。我们写到的时候也能感受到串口发送比接收简单多了。 2.2 数据包的接收 接受一个数据包就比较复杂了。我们来学习一下。 这里演示了固定包长 HEX 数据包的接收方法。首先根据前一节的代码我们知道每收到一个字节程序都会进一遍中断在中断函数里我们可以拿到这一个字节但拿到之后我们就得退出中断了所以每拿到一个数据都是一个独立的过程而对于数据包来说很明显它具有前后关联性包头之后是数据数据之后是包尾对于包头、数据和包尾这三种状态我们都需要有不同的处理逻辑所以在程序中我们需要设计一个能记住不同状态的机制在不同状态执行不同的操作同时还要进行状态的合理转移这种程序设计思维就叫做“状态机”。 在这里我们就使用状态机的方法来接收一个数据包要想设计一个好的状态机程序画一个下面这样的状态转移图是必要的。对于上面这样一个固定包长 HEX 数据包来说我们可以定义 3 个状态第一个状态是等待包头第二个状态是接收数据第三个状态是等待包尾。每个状态需要用一个变量来标志一下比如我这里用变量 S 来标志三个状态依次为 S 0S 1S 2这一点类似于置标志位只不过标志位只有 0 和 1而状态机是多标志位状态的一种方式然后执行流程是 最开始S 0收到一个数据进中断根据 S 0进入第一个状态的程序判断数据是不是包头 FF如果是 FF则代表收到包头之后置 S 1退出中断结束这样下次再进中断根据 S 1就可以接收数据的程序了那在第一个状态如果收到的不是 FF就证明数据包没有对齐我们应该等待数据包包头的出现这时状态就仍然是 0下次进中断就还是判断包头的逻辑直到出现 FF才能转到下一个状态。那之后出现了 FF我们就可以转移到接收数据的状态了。这时再收到数据我们就直接把它存在数组里另外再用一个变量记录收了多少个数据如果没收够四个数据就一直是接收状态如果收够了就置 S 2下次中断时就可以进入下一个状态了。那最后一个状态就是等待包尾了判断数据是不是 FE正常情况应该是 FE这样就可以置 S 0回到最初的状态开始下一个轮回当然也有可能这个数据不是 FE比如数据和包头重复了导致包头位置判断错了那这个包尾位置就有可能不是 FE这时就可以进入重复等待包尾的状态直到接收到真正的包尾。这样加入包尾的判断更能预防因数据和包头重复造成的错误。 这就是使用状态机接收数据包的思路。这个状态机其实是一种很广泛的编程思路在很多地方都可以用到。使用的基本步骤是 先根据项目要求定义状态画几个圈然后考虑好各个状态在什么情况下会进行转移如何转移画好线和转移条件。最后根据这个图来进行编程。 这样思维就会非常清晰了。比如你要做个菜单就可以用到状态机的思维按什么键切换什么菜单执行什么样的程序还有一些芯片内部逻辑也会用到状态机。比如芯片什么情况下进入待机状态什么情况下进入工作状态这也是状态机的应用希望大家可以研究一下对你的编程肯定会有帮助。 这里演示了可变包长 文本 数据包的接收方法。我们看一下可变包长 文本 数据包的接收流程同样也是利用状态机定义了三个状态。 第一个状态等待包头判断收到的是不是我们规定的 符号如果收到 就进入接收状态。在接收状态下依次接收数据同时这个状态还应该要兼具等待包尾的功能因为这是可变包长我们接收数据的时候也要时刻监视是不是收到包尾了一旦收到包尾了就结束那这里这个状态的逻辑就应该是收到一个数据判断是不是 \r如果不是就正常接收如果是则不接收同时跳到下一个状态等待包尾 \n因为这里数据包有两个包尾 \r\n所以需要第三个状态。如果只有一个包尾那在出现包尾之后就可以直接回到初始状态了只需要两个状态就行。因为接收数据和等待包尾需要在一个状态里同时进行。由于串口的包头包尾不会出现在数据中所以基本不会出现数据错位的现象。 这就是使用状态机接收文本数据包的方法。 其他的数据包也都可以套用这两个形式等会我们写程序就会根据这里面的流程来。 到这里关于数据包的定义、分类、优缺点和注意事项就介绍完了。 包头 FF 和 包尾 FE 用于控制接收没有显示。
http://www.zqtcl.cn/news/804086/

相关文章:

  • 有关wordpress教学的网站wordpress返回旧版
  • php做网站弊端wordpress强大播放器
  • 怎么直接做免费网站wordpress如何自建站
  • 中国建设银行建银购网站金堂企业网站建设
  • 手机微网站开发的目的和意义温州公司网站开发
  • 除了外链 还有什么办法使网站提高排名网站建设珠海 新盈科技
  • 几分钟弄清楚php做网站中国风景摄影网
  • 卡片式网站网页设计公司的市场评估
  • 网站开发的感想wordpress水煮鱼
  • 网站开发入门培训机构自豪地采用wordpress更改
  • 手机网站来几个最近的国际新闻大事件
  • 重庆网站开发设计公司电话资源网站优化排名
  • 国土分局网站建设方案外贸seo网站
  • 营销型网站建设易网拓烟台h5网站建设公司
  • PHP网站开发都需要学什么中介网站模板
  • 网站建设与维护模板官方网站建设费用应入什么科目
  • 网站建设企业关键词seo关键词库
  • 美容院网站源码wordpress scandir
  • 长春电商网站建设报价北京创意设计协会网站
  • 企业3合1网站建设公司加强政协网站建设
  • 专业做互联网招聘的网站有哪些内容百度搜索引擎推广收费标准
  • 物流网站开发系统论文怎么知道网站程序是什么做的
  • 湖南高端网站制作公php网站后台
  • 建好的网站在哪里wordpress部署到git
  • 浙江坤宇建设有限公司网站毕业设计 旅游网站建设
  • 做网站月收入多少视频短视频api
  • 泰安网站建设哪家强网站流量指标
  • 网站毕业设计开题报告wordpress账户密码忘记
  • 做网站学费多少钱0基础学app程序开发
  • 忻州建站公司辽宁省建设执业信息网官网