串口数据包

一数据包的定义  

        ·串口数据包:通常使用的是额外添加包头包尾的这种方式

        ·在HEX数据包里面,数据都是以原始的字节数据本身呈现的,而在文本数据包里面,每个字节就经过了一层编码和译码,最终表现出来的就是文本格式,但是实际上每个文本字节的背后都还是一个HEX数据。

        ·优缺点:

        HEX数据包优点:传输最直接,解析数据非常简单,比较适合一些模块发送原始的数据

                          缺点:灵活性不足,容易和包头包尾重复,

        文本数据包优点:数据直观易理解,非常灵活,比较适合一些输入指令进行人机交互的场合,比如蓝牙模块常用的AT指令,CNC和3D打印机常用的G代码,都是文本数据包的格式。

                          缺点:解析效率低,比如发送一个100,HEX数据包就是一个字节100,但是文本数据包就得是三个字节的字符‘1’‘0’‘0’,收到之后还要把字符转化成数据,才能得到100,

串口收发hex数据包

        ·固定包长:含包头包尾,每个数据包的长度都固定不变,数据包前面是包头,后面是包尾
        ·可变包长:含包头包尾,每一个数据包的长度可以是不一样的,前面是包头,后面是包尾。他的数据包格式可以根据用户需求自己规定。

        ·包头包尾和载荷重复解决办法:

        ·如果数据含有FF和FE,和包头包尾重复了怎么办?会引起误判,对于这个问题也有相应的几种解决方法:

        1.限制在和数据的范围,如果可以的话,可以在发送的时候对数据进行限幅。比如X、Y、Z三个数据的范围是0-100,那么可以在载荷中只发送0-100的数据,以此防止和包头包尾重复。

        2.如果无法避免载荷数据和包头包尾重复,则尽量使用固定长度的数据包,由于载荷数据是固定的,只要通过包头包尾对齐了数据,我们就可以严格知道,那个数据是包头包尾,哪个数据是载荷数据。

        在接收载荷数据的时候,我们并不会判断他是不是包头包尾,但是在判断包头包尾的时候会判断他是不是确实是包头包尾,用于数据对齐,在经过几个数据包对齐之后,剩下的数据包就不会出现问题了。

        3.增加包头包尾的数量,并且尽量让他呈现载荷数据出现不了的状态。比如我们使用FF、FE作为包头,FD、FC作为包尾,这样也可以避免包头包尾和载荷数据重复的情况发生。

        ·并不是所有的包头包尾都需要,可以只要一个包头,把包尾删掉,这样数据包的格式就是一个包头FF加四个数据。当监测到FF开始接收,当收够四个字节后置一个标志位,一个数据包接收完成。不过这样会加重载荷和包头重复的问题。最坏的情况下载荷全是FF,包头也是FF。如果加上了包尾FE,无论数据怎么变化都是可以分辨出包头包尾的。

        ·固定包长和可变包长的选择:

        对于HEX来说,如果载荷会出现包头和包尾重复的情况,最好是选择固定包长,以避免接收错误。如果重复还选择可变包长,数据容易乱套。如果包头包尾不会和载荷重复,可以选择可变包长

        ·关于各种数据转换为字节流的问题。

        数据包都一个字节一个字节组成的,如果想发送16、32位的整型数据,float、double甚至是结构体都没问题,因为内部是由一个字节一个字节组成的,仅需要用一个uint8_t的指针指向他,并把他们当做一个字节数组发送即可。

串口收发文本数据包

        ·由于数据译码成了字符形式,这样就会存在大量的字符可作为包头包尾,可以有效的避免载荷和包头包尾重复的问题。比如以@ 作为包头,以\r\n这两个换行字符作为包尾,在载荷数据中间可以出现除了包头包尾的任意字符。文本数据包基本不用担心包头包尾和载荷重复的问题,可变包长、各种符号、字母、数据都可以随意使用

        ·当接收到载荷数据之后,得到的就是一个字符串,在软件中对字符串进行操作和判断,就可以实现各种指令控制的功能,而且字符串数据包表达的意义很明显,可以把字符串数据包直接打印到串口助手上,各种指令和数据都可以一眼看清。

        ·文本数据包通常会以换行作为包尾,在打印的时候就可以一行一行显示,比较方便。

二、数据包的收发流程

HEX数据包接收(固定包长)

        在接收的时候,每收到一个字节,程序都会进一遍中断,在中断函数里面可以拿到这一个字节,在拿到数据之后就得退出中断了,每拿到一个数据都是一个独立的过程。对于数据包来说很明显有一个前后关联性,包头之后是数据,数据之后是包尾。对于包头数据包尾这三种不同的状态,我们需要有不同的处理逻辑,在程序中需设计一个记住不同状态的机制,在不同状态执行不同操作,同时还要进行状态的合理转移

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 02:44:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 02:44:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 02:44:03       87 阅读
  4. Python语言-面向对象

    2024-03-17 02:44:03       96 阅读

热门阅读

  1. 前端实现双token的无感刷新技术方案

    2024-03-17 02:44:03       46 阅读
  2. 面试官常问问题

    2024-03-17 02:44:03       46 阅读
  3. QT for Mcu的学习建议

    2024-03-17 02:44:03       41 阅读
  4. docker 基本指令的使用

    2024-03-17 02:44:03       42 阅读
  5. 八股文打卡day34——数据库(11)

    2024-03-17 02:44:03       41 阅读
  6. 面向对象(五)

    2024-03-17 02:44:03       44 阅读
  7. 2014

    2014

    2024-03-17 02:44:03      47 阅读
  8. KY158 找x

    2024-03-17 02:44:03       37 阅读
  9. 两个数组的交集

    2024-03-17 02:44:03       38 阅读