串口通信的帧同步问题

发布者:Tianyun2021最新更新时间:2018-06-01 来源: eefocus关键字:串口通信  帧同步 手机看文章 扫描二维码
随时随地手机看文章

封装STM32串口的底层时,遇到了串口帧同步的问题。虽然以前也遇到类似场合,写出来的代码基本能够解决问题,但是在逻辑上总是不能彻底的解释一些细节。

当前的工作环境:

由于代码想用在一个简单的PID闭环上,做在线的参数整定。假设当前PID解算周期是1ms,即每1ms,做一次串口的收包,解包,Pid解算,数据采集,然后打包,发包。也就是说是固定步长的解包。

串口的方案是开启收发的DMA以及DMA的中断。(坚决不考虑直接使用串口中断。一个字节中断一次太费资源)。DMA数组作为串口的FIFO队列(并不是真正意义上的队列)。

当前的需求:

1、时间节拍到来时,检查是否有收到数据。没有则跳出,有则进入下一步

2、检查数据中的包格式,比如包头是否正确,帧长度是否对齐,CRC(目前还没有做进去)等

3、包格式检查出错误,回包时添加标志位,声明包格式错误请求重发。包格式没有错误则进行解包并设置对应的寄存器和赋值。

4、具有合理的接收缓冲区,大于缓冲区的数据进行放弃。

5、能够及时检测出丢字节,多字节等帧长度出错的问题。


几套尝试过的方案:

1、DMA数组的长度和帧长度相等。

触发条件:DMA计数值减到0(即已经收满一个帧的长度的数据)产生DMA中断,将触发标志位写1。PC机上可以通过开启一个线程监视缓冲区数量实现。

解包操作:设置共用体,其中结构体为帧协议,同时公用一个u8 数组作为DMA数组。判断触发条件,若满足,读取共用体中的包头包尾,若正确,继续读取成员,解包赋值。

缓冲机制:无。DMA设置为normal模式,计数减到0后即停止。有新的数据到来也不会被传入数组。PC机上可以手动关闭串口。

报错机制:

帧错位:在包头检查中会发现,舍弃当前帧,设置重发标志位请求重发。

字节缺失:字节缺失的帧发送完成后不会满足触发条件,等到第2帧的数据的前几个字节填满缺失的帧后,触发解包操作。在检查包围的时候,报错响应。舍弃字节缺失帧,但是难以保证字节缺失帧的后几帧能顺利接收。而且出错和报错响应不同步。即报错响应出现在错误的下一帧。

字节超出:字节超出的帧会及时响应,并且由于包尾错误,会立即响应报错并请求重发。

解包过快:不会出现解包速度大于收包速度。因为数据满一个帧长度才会解包。


2、DMA数组指向元素类型为帧结构体的链表

触发条件:DMA计数值减到0(即已经收满一个帧的长度的数据)产生DMA中断,DMA中断中对List进行Push_back操作,增加一个element,然后将DMA的内存地址指向新的element的首地址。触发条件是List的size大于1(在没有收到任何报文之前,得有一个空element用于放置马上要到来的报文);

解包操作:检查List第1个元素的包头包尾,如果正确,读取成员解包赋值,然后对List进行pop_front,直到list的size等于1.

缓冲机制:链表天然的缓冲机制,唯一担心的是堆溢出,可以设置一个上限,在中断里判断。

报错机制:

帧错位:在包头检查中会发现,但是需要丢弃缓冲区内错位帧之后所有的帧。因为后边的必然都错位了。

字节缺失:第2帧到来时,检查包尾时发现。同样存在报错响应不同步的问题。

字节超出:报错同步响应。丢弃缓冲区中所有帧

解包过快:不存在这个问题。理由同 方式1.


3、DMA数组指向多倍于帧长度的数组首地址

触发条件:缓冲队列非空。触发响应后,立即将缓冲队列memcpy到临时数组进行解包。同时清空队列。

解包操作:在临时数组中搜索包头的第1个字节,一单满足,立即检查:包头第2字节,包尾是否在缓冲区长度内,包尾是否正确。如果4个条件均满足,立即开始解包赋值。完成后重复上一步,在数组中搜索第2个包头。直到最后在缓冲区末端,残留帧的前一部分,舍弃该无尾帧。

缓冲机制:由缓冲队列作为缓冲。

报错机制:

帧错位:在临时数组中不存在帧错位的概念,帧错位完全可以被正确解包。

字节缺失:在解包步骤中被检测到包尾有误,则请求重发。而且能同步响应。

字节超出:同字节缺失

解包过快:由于触发方式为缓冲队列非空。如果查询触发条件时,恰好接收了部分帧,则仍然能满足触发条件。那么此时这个接收了一部分的帧会作为字节缺失的帧被舍弃并进行报错


小结:

三种方式对比下来,第3种方式有着较优越的性能,而且能够很好地移植到PC机上实现。但是对于解包过快的问题,仍然需要讨论。


字节缺失同步响应和解包过快的矛盾:

问题可以被化简为:一个10字节的帧,解包时,如果包里只有9个字节,那这一帧到底是没发完还是字节缺失。

如果使用“已收到大于10个字节的数据”作为解包触发条件,那么解包时永远有10个字节,判断最后一个字节是否是包尾,即可。但是字节缺失永远只能在下一帧响应。

如果使用“缓冲区数据多于0”作为解包触发条件,虽然字节缺失能立即被响应,但是也有可能将未发完的帧误判。


因此需要针对当前的应用进行分析。目前对于单片机的帧率和帧长度为:

波特率:115200

发送帧率:5f/s

发送帧长:20 Bytes

接收帧检测周期:1ms

接收帧长度:10 Bytes


传送1Byte数据,由于没有校验位,1个停止位,因此需要10bits。

那么传输速率为11520B/s(约11KB/S),即传输1Byte需要86.8us(约0.1ms)。

发送帧每一帧20Bytes,需要1.736ms(约2ms)

接收帧每一帧10Bytes,需要0.858ms(约1ms)


因此对于当前的情况下单片机的接收条件,1ms解包一次,完全不需要缓冲区,但是却有很大可能发生在帧截断。

因此应该采用“已收到等于帧长度个字节的数据”作为触发条件。放弃字节缺失帧的同步响应。

但是对于PC机端,如果同样为1ms间隔检测触发条件,接收帧的时常变为1.736毫秒,那么一个间隔内是必然收不满1帧的。

因此同样可以采用“已收到等于帧长度个字节的数据”作为触发条件。放弃字节缺失帧的同步响应。

但是对于Qt上的串口类,现在还没有摸清他的工作原理,尚无法讨论何种方法比较合适。


/**********************************11月1日更新分割线****************************************/

一个能够提高缺字节帧报错响应速度的方案:

判断帧是丢字节还是未发完的区分方式其实是在时间上。

比如之前提到的115200波特率,20Bytes的帧,其传送时间应该小于2ms。

因此,当:接收缓冲区有数据,单数据未到达20Bytes时,若这种状态维持超过2ms,则说明传输已经完成,缺字节。

而程序本身的step timer已经有了计时的功能。因此,实现方式如下。


声明一个标志位1:FIFO队列有数据但不满帧长度。

声明一个计数器1:标志位1的计数。


当FIFO队列数据从0跳变到1时,set标志位1。

CheckMailBox时,标志位1已置位,则将计数器1的值加1。

由于20Bytes的帧在2ms内应该发送完。而解算周期为1ms。

故,当计数器1的值大于2时,如果FIFO队列数据长度仍然没有达到帧长度,说明该包有数据丢失。set报错标志位。

即可检测出丢字节的帧。


关键字:串口通信  帧同步 引用地址:串口通信的帧同步问题

上一篇: 导出函数给APP调用出现malloc无法分配内存的问题
下一篇:STM32F10X USART发送详解,测试无误

推荐阅读最新更新时间:2024-03-16 16:04

基于单片机和PC串口通信的测温系统设计
  温度是工业控制中主要的被控参数之一,在日常生活及工农业生产中经常要用到温度的检测及控制,因此研究温度的测量方法和装置具有重要的意义。传统方法多以热电阻和热电偶等为温度传感元件,而这种模拟温度传感器输出为模拟信号,必须经过A/D 转换环节获得数字信号后才能与单片机等微处理器接口,使得硬件电路结构比较复杂、抗干扰性差、布线麻烦以及成本高等缺点。   针对上述问题,该设计提出了基于Dallas 半导体公司的数字式温度传感器DS18B20[1-2]和ATMEL 公司AT89S52 单片机构成的温度测量系统,并可通过串口连接在PC 系统上进行实时显示,该系统安装简易,可靠性高,适用于恶劣环境的现场温度测量。   1 系统构成
[单片机]
基于单片机和PC<font color='red'>串口通信</font>的测温系统设计
51单片机字符串口通信为什么乱码?终于找到原因了
被这个问题卡了3天,代码很简单就是乱码出问题,烦恼! 后来查资料找到原因,晶振12MHz和11.0592Hz的问题。 如果你用的是12Mhz的单片机,定时器初值TH1一般要设置到E6(2400bps)、F3(4800bps)。 对应的在上位机配置UART串口时,选取2400 4800bps。如果试了不行,那就换更低的1200bps。 修改前 修改后 做了半天才发现我的晶振是11.0592Mhz,为啥对应的开发板视频讲的是12Mhz。 以4800bps为例,TH1=TL1=0xF4,SMOD=1,波特率翻倍=2*2400bps。这样就不会乱码了 ------------------------------
[单片机]
51单片机字符<font color='red'>串口通信</font>为什么乱码?终于找到原因了
单片机与上位机的串口通信
照片名称:串口发送数据十六进制55 照片名称:串口通信输入十六进制55 照片名称:串口通信输入十六进制55 照片名称:串口发送数据十六进制aa 照片名称:串口通信输入十六进制aa 照片名称:串口通信输入十六进制aa #include reg52.h #define uchar unsigned char #define uint unsigned int          //宏定义 sbit duan=P2^6;              //位声明 sbit wei=P2^7; uchar code sz ={             // 数码管 显
[单片机]
单片机与上位机的<font color='red'>串口通信</font>
51单片机串口通信中的检错方法
0 引言 对于基于flash控制器的8051的芯片结构,一般在进行数据传输时,都是先通过串口将数据传送到flash控制器的buffer中。由于buffer的大小为512 bytes,所以每次传输的最大数据量为512bytes。本文中所讨论的三种检错方法的传输数据量均为512 bytes。 1 检错方式 基于8051的串口数据通信系统的硬件开发平台框图如图1所示。利用该平台进行数据传输时,通常有三种数据检错方式。 1.1 奇偶校验 奇偶校验是检错中比较常见的一种方法。它利用数据中的1的个数作为检错的标志位,若1的个数为奇数个,则错误检测的标志位为1,若1的个数为偶数,则错误检测的标志位为0。在发送端和接收端同时检测
[单片机]
51单片机<font color='red'>串口通信</font>中的检错方法
单片机与PC机的串口通信课程设计
1.1设计目的 单片机与PC机串行通信端口在系统控制的范畴中一直占据着及其重要的地位,它不仅没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。作为一种基本而又灵活方便的通信方式,串口通信被广泛应用于PC与PC或者PC与单片机之间的数据交换以及其他工业控制与自动控制中。如今,在很多场合中,要求单片机不仅能独立完成单机的控制任务,还要能与其他数据控制设备(单片机、PC机等)进行数据交换。因此如何实现PC机与单片机之间的通信具有非常重要的现实意义。 1.2设计内容 以单片机与PC机为核心,实现单片机与PC机机的串口通信。 2系统硬件电路设计 2.1系统设计框图 图2-1 系统设计框图 2.2串口通信基
[单片机]
单片机与PC机的<font color='red'>串口通信</font>课程设计
STM32F4之USART串口通信
资源:STM32F407有2个UART(通用异步收发器),4个USART(通用异步/同步收发器) 在STM32F407ZET6的手册上有描述, 这些接口所对应的引脚如下: 在这里我们选用串口1进行简单编程: 实现功能吐下: 1.每秒发送一个数字 2.进行数据回传 其所要配置的内容如下: 1.GPIO的时钟使能 2.声明一个GPIO结构体变量,进行定义并进行初始化,主要是开启复用功能 3.将GPIO复用为何,将IO口功能配置为USART功能 4.USART1的时钟进行使能 5.声明一个USART结构体变量,进行定义并进行初始化,设置其波特率,停止位,字长,是否硬件流控制,收发模式,
[单片机]
STM32F4之USART<font color='red'>串口通信</font>
知道STM32串口通信乱码要怎么处理吗
STM32串口通信以及温度采集搞定,其中主要遇到STM32系列单片机时钟树的问题,串口通信遇到串口调试助手能够接收到数据但出现乱码现象。 开始一直以为是串口配置和程序代码问题,因为是第一次上电在线调试STM32板子,后面主要查串口波特率配置和收发函数程序段,如下图: 波特率设置成115200没问题,试着降低波特率改成9600和4800但问题依旧没有解决,紧接着如下处理: 将重定向函数注释,单独写串口发送字节和字符串函数,依旧失败。最后锁定到系统时钟配置上,由于手上的STM32开发板改用了12M的晶振,根据单片机时钟树的理解和解读,一般采用外部时钟HSE,系统时钟配置成72M,8*9=72,,12*6=72,对于 SYS
[单片机]
知道STM32<font color='red'>串口通信</font>乱码要怎么处理吗
采用LabVIEW的PC机与变频器的串口通信
本文针对摩擦学试验研究的特点,采用广泛使用的LabVIEW编程语言,开发用于东元7200MA变频器运行频率的控制串口通讯程序。 由于摩擦学试验机和摩擦学测试的特殊性,摩擦学试验中的变频器调速有着不同于一般工业变频控制的特点。一方面,要求变频器调速能够在较大范围内满足摩擦学测试的要求,使得试验结果具有可比性;另一方面,摩擦磨损试验过程中,对控制有一些特殊的要求,例如需要特殊的速度、运动的非周期性以及设备的快速启动和停止等。在一些疲劳试验中,甚至要求电机进行寸动或者往复运动以检测材料的性能,有的试验现场对人体的损害比较大,需要远距离进行控制和检测电机的运转情况。所以,必须利用计算机程序控制变频器实现一些特殊控制功能。这就
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved