tag 标签: 嵌入式系统与MCU

相关帖子
相关博文
  • 2025-5-23 11:48
    0 个评论
    一、环境背景: 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个字节的发送时间间隔为140us64us(1个字符时间),所以在STM32G030的Usart(空闲中断+DMA接收数据)中,这一帧数据只有7个字节,第8个字节在下一帧数据中。 为什么在波特为9600的情况下数据就正常呢,原因如下: 波特为9600的情况下发送一bit位的时间为104us,发送一个字节的时间为832us;由于第8个字节与第7个字节的发送时间间隔为140us832us(1个字符时间),所以在STM32G030的Usart(空闲中断+DMA接收数据)中,这一帧数据接收到了8个字节。 2、其他问题分析: 经过波形图分析,问题出现在CH32F460的串口端;最后发现CH32F460的串口阻塞模式发送数据,在发送一帧数据未完成的时候,发送被其他程序打断,因此出现数据帧断帧的问题。 四、总结问题: 遇到通信丢失数据的问题,一定要看波形,一定要看波形,一定要看波形,重要的事情要说三遍;少一点“我认为、我觉得、”,多动手验证,用数据分析问题,才能说服别人。一定对自己自信、自信、自信。