江协科技stm32————9-4USART串口数据包

目录

HEX数据包

可能产生的问题 

文本数据包

HEX数据包和文本数据包优缺点对比

数据包的发送流程

数据包的接收流程 

HEX数据包接收

状态机工作流程

 文本数据包接收


HEX数据包

串口数据包通常使用额外添加包头包尾的方式 

可以规定一批数据有4个字节,在4个字节之前添加包头0xFF,在之后添加包尾0XFE,当我们接收到0xFF时,就知道一个数据包来了,接着接收到的4个字节就作为数据包的第1、2、3、4个数据存储在数组中,最后接收到包尾0xFE时,就可以置一个标志位表示收到了一个数据包。

可能产生的问题 

一、包头包尾和数据载荷重复的题,这里定义FF为包头,FE为包尾,如果我传输的数据本身就是FF和FE怎么办呢?那这个问题确实存在,如果数据和包头包尾重复,可能会引起误判。对应这个问题我们有如下几种解决方法:

  • 第一种,限制载荷数据的范围。如果可以的话,我们可以在发送的时候,对数据进行限幅,比如XYZ,3个数据,变化范围都可以是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的指针指向它,把它们当做一个字节数组发送就行了。

文本数据包

 文本数据包字符较多,基本不用担心包头包尾重复的问题

HEX数据包和文本数据包优缺点对比

HEX数据包的优势在于传输最直接且解析数据简单,适合发送原始数据的模块,如使用串口通信的陀仪、温湿度传感器。然而,其缺点是灵活性不足且载荷容易与包头包尾重复。文本数据包的优点在于数据直观且易于理解,适合输入指令进行人机交互的场合。例如,蓝牙模块常用的AT指令、CNC和3D打印机常用的G代码都导文本数据包的格式。然而,其缺点是解析效率低。例如,发送数字100时,HEX数据包只需一个字节100即可,而文本数据包则需要三个字节的字符"1','0’,’0’。收到后还需将字符转换为数据才能得到100。

数据包的发送流程

在发送HEX数据包时,可以通过定义一个数组,填充数据,然后使用之前我们写过的SendArray函数发送即可。在发送文本数据包时,可以通过写一个字符串,然后调用SendString函数发送。因此,发送数据包的过程是可控的,我们可以根据需要发送任何类型的数据包。

数据包的接收流程 

HEX数据包接收

每收到一个字节,程序就会进入一次中断,在中断函数里,我们可以获取这个字节,但获取后需要退出中断。因此,每个收到的数据都是独立的过程,而数据包则具有前后关联性,包括包头、数据和包尾。为了处理这三种状态,我们需要设计一个能够记住不同状态的机制,并在不同状态下执行不同的操作,同时进行状态合理转移。这种程序设计思维就是“状态机”。 

状态机工作流程

初始时,S=0表示等待包头状态。当中断发生时,根据S=0的状态,程序会进入等待包头的逻辑。如果收到的数据是FF(包头),则将状态设置为S=1并退出中断。然后根据S=1的状态,进行接收数据的程序。如果收到的不是FF,就证明数据包没有对齐,那么需要继续等待包头出现,状态保持为S=0当收到FF(包头)后,状态会转移到S=1(接收数据状态)。在此状态下,接收到的数据会被存储在数组中,并记录已收到的数据数量。当收到4个数据后,将状态设置为S=2(等待包尾状态)。在等待包尾状态下(S=2),程序会等待收到FE(包尾)。如果收到FE,则将状态重置为S=0(等待包头状态),开始下一个数据包的接收。如果收到的不是FE,那么需要进入重复等待包尾的状态,直到接收到真正的包尾 

 文本数据包接收

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值