Usart之(空闲中断+DMA接收数据)遇见过的坑

## Usart之(空闲中断+DMA接收数据)遇见过的坑
一、环境背景:

  1. 说明:
    使用STM32G030的串口与CH32F460的串口通信,STM32G030通过Usart的DMA+空闲中断接收数据,同事使用CH32F460的串口阻塞模式发送数据。在通信工程中,出现STM32G030接收到的数据有时会不完整;为了确保STM32G030接收数据是没问题的,我通过串口助手轰炸式给STM32G030发送数据,如下图:

轰炸前:
在这里插入图片描述

轰炸后:
在这里插入图片描述

通过串口助手验证,不管是STM32G030,还是同事的CH32F460都能与串口助手正常收发数据。但是当STM32G030与同事的CH32F460通信时就会出现数据接收不完整的情况!

2、硬件原理图
在这里插入图片描述

两个串口的上拉电源都是3.3V,原理图上没修改而已;

二、查找问题:

1、为排除干扰问题,硬件上我去掉两个串口之间的MOS管,使用直连的方式,但是问题依然存在;

2、修改通信的波特率,开始是使用115200,改为192000问题还是存在;于是改为9600,这时再仿真,发现数据离奇的正常,但是不明白其中的原理;

3、本着追本溯源的精神,于是我又通过示波器,观看发数据时有问题的数据波形,查找问题;

波形图如下:

录波背景:波特率115200
在这里插入图片描述

通过波形图不难发现,在一帧有问题的数据中,其最后一个字节的发送时间间隔和其他字节不同。

注:起始位低电平有效,截止位高电平有效。

三、分析问题:

  1. 波形分析:

    通过波形图,发现最后一个字节(第8个字节),距离前一个字节的发送时间差140us;
    波特115200:
    波特115200的情况下发送一bit位的时间为8us,发送一个字节的时间为64us;在串口的空闲线路检测中,当UART总线在一段时间内(1个字符时间以上)没有新数据时,硬件会触发IDLE中断,此时可认为一帧数据结束。由于第8个字节与第7个字节的发送时间间隔为140us>64us(1个字符时间),所以在STM32G030的Usart(空闲中断+DMA接收数据)中,这一帧数据只有7个字节,第8个字节在下一帧数据中。

为什么在波特为9600的情况下数据就正常呢,原因如下:
波特为9600的情况下发送一bit位的时间为104us,发送一个字节的时间为832us;由于第8个字节与第7个字节的发送时间间隔为140us<832us(1个字符时间),所以在STM32G030的Usart(空闲中断+DMA接收数据)中,这一帧数据接收到了8个字节。

  1. 其他问题分析:

    经过波形图分析,问题出现在CH32F460的串口端;最后发现CH32F460的串口阻塞模式发送数据,在发送一帧数据未完成的时候,发送被其他程序打断,因此出现数据帧断帧的问题。

四、总结问题:

  • 遇到通信丢失数据的问题,一定要看波形,一定要看波形,一定要看波形,重要的事情要说三遍;少一点“我认为、我觉得、”,多动手验证,用数据分析问题,才能说服别人。一定对自己自信、自信、自信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值