STM32串口通信详解以及通信异常或者卡死常见问题分析 异常一:数据传输中会出现乱码 数据传输中会出现乱码,很有可能是数组溢出,或者定义的数组长度不够。或者中断被打断。 异常二:程序卡在中断函数里面无法跳出执行主函数的逻辑 中断标志位没有被清除,在这里要注意一点,串口中断标志位自动清空的前提是软件需要先读USART_SR寄存器,然后读USART_DR寄存器来自动清除。即串口中断事件发生后,如果使能的接收中断,而中断函数里面什么都不执行的话,接收中断标志位是无法自动清空的,故而,函数会一直卡在中断函数里面。 比如一下这个函数,该函数没有逻辑问题,但会引发以上问题,代码如下 以下写法有严重问题 如果没有这句函数→USART_ClearFlag(USART1,USART_FLAG_RXNE); //清空中断标志位 串口接收中断标志位将文法被清空,会导致函数卡在中断函数里面一直循环,无法正常运行主函数 原因分析: 中断条件成立后,中断标志位将会标记,程序将会进入中断函数运行,软件自动轻触中断标志位的条件是 先读USART_SR寄存器,再读USART_DR寄存器。 异常三:数据发送中间歇性数据异常漏发乱发等对于这些奇奇怪怪的问题,首先要了解一下发送函数是怎么发送的 USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR读取数据会自动提取 RDR 数据。 TDR 和 RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。 当 TDR 内容转移到发送移位寄存器,还没有发送出去的,就再次把TDR 内容转移到发送移位寄存器里,就会出现少发的现象。 什么时候会有这种情况呢?错误操作代码如下: 上述代码连续运行了3次USART_SendData(USART1, Usart1RecBuf);这个函数,这种情况一般都会出现只有最后一个数据发送成功出去。原因可能就是数据还没有发送出去,发送移位寄存器就更新了。 【文章福利】stm32相关学习资料,大家可学习一下: 学习技术群: (stm32 USART串口应用) 基于STM32讲解串口操作 通过Z-stack协议栈实现串口透传 通信协议 – UART串口协议
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/82620.html