串口能收发数据,收发乱码
1.波特率计算错误
依据手册给出的波特率计算公式,计算波特率,检查波特率配置。同时某些MCU的串口配置寄存器中有过采样配置(OVER8),不同的过采样的波特率计算公式存在差异,需要根据需求计算正确的波特率。
2.波特率寄存器BRR值存在误差
某些MCU手册中给出的计算公式计算的波特率存在误差,如果直接将存在误差的计算结果写入到BRR寄存器中,会导致出现部分或全部乱码现象。建议在写入BRR寄存器的配置中,采用直接设置波特率计算公式的方式写入,消除误差影响。
3.收发端波特率配置不同步
收发端需要配置成相同波特率再尝试通信,常见波特率9600,115200等。
4.时钟错误
最常见的错误,查看代码或使用ST-link进入keil调试模式查看RCC寄存器,查看单片机采用的是哪个时钟作为系统的主时钟(内部HSI,MSI,外部HSE等等),依据不同时钟的频率及配置的时钟频率,重新修改波特率,或修改系统主时钟频率/系统主时钟切换等。
5.外部晶振错误
外部晶振损坏,更换板载外部晶振;程序中外部晶振配置错误,修改程序重新配置外部晶振。
6.串口挂错时钟线
查询芯片编程手册,查看RCC部分,查询所使用到的相关串口挂载在哪一条时钟线上(APB1/2ENR,AHB1/2ENR等),挂错时钟线串口将无法正常接收数据。会导致无反应或乱码。
7.485终端匹配电阻问题
在现场应用时,为了保证长距离传输的稳定性,抑制信号反射和保持信号完整性,需要用到终端匹配电阻,阻值选择错误或短距离实验的时候使用终端匹配电阻可能会造成数据错误乱码
解决方法:
1.终端匹配电阻的数值一般为总线特性阻抗的一半,根据计算重新修改终端匹配电阻的阻值
2.若在短距离实验中使用,可以尝试先拆除终端匹配电阻再进行通信
串口能收发数据,发出数据与接收数据相反
具体表现为,例如:
发送16进制0X02(二进制00000010),接收16进制0XBF(二进制10111111)
发送16进制0X00(二进制00000000),接收16进制0XFF(二进制11111111)
发送0X55,能正常接收0X55:
485的RX,TX线接反了。
串口发送不了数据
1.中断函数名写错
STM32中,每一个中断都有固定的中断函数命名,不能擅自随意修改,否则无法正常进入该中断函数。
解决方法:在KEIL中双击Target,查看每一个中断函数的固定命名,并根据此进行修改。
2.串口时钟没有开启
根据所使用的串口,开启相应的串口时钟。若使用了DMA,也需要开启相应的DMA时钟。
3.485没有切换收发状态
配置在收发的时候在需要切换的位置切换485的对应收发态。485属于半双工通信,无法进行同时收发通信。
4.485收发丢失字节
1.可能由于在判断传输完成的时候采用了TXE发送缓存区空中断,而非TC传输完成中断。因此在发送缓冲区为空时,可能数据在TX线上还未传输完成,导致字节丢失。
解决方法:修改配置为TC传输完成中断
2.使用了DMA中断。根据时序图,DMA传输完成,产生中断时,TX线上还在进行数据传输
详见:STM32L4-RS485+DMA中断通信实验+字节丢失处理[寄存器版]_staypt的博客-CSDN博客
5.引脚配置错误
1.某些MCU在配置串口等通信的时候,需要配置引脚复用。
解决方法:在GPIO的AF寄存器中配置对应的引脚复用,将引脚复用为USARTX
2.引脚配置错误
解决方法:重新配置引脚。
4.引脚时钟未开启
解决方法:开启对应的GPIOX引脚时钟。
------------------------------------------9.21更新:--------------------------------------------
6.串口数据溢出
使用中断接收开启RXNE的时候,MCU会同时默认开启ORE中断,若下一帧数据到来时前一帧的数据没有及时读出,会导致产生ORE中断,导致串口宕机,表现为卡死在中断中无法出来。
解决方法:
1.分别先后读取ISR和DR寄存器,清除ORE中断标志位。
2.在STM32的某些系列中,提供了屏蔽ORE中断的寄存器位(USART_CR3的OVRDIS),对该寄存器写1可默认关闭ORE中断。
3.在STM32的某些系列中,提供有USART_RQR寄存器,对你该寄存器中的RXFRQ写1可在不读取RDR寄存器的情况下丢弃收到的数据。
7.串口接收/发送数据速度过快
使用轮询方式接收数据或中断判断速度过快(尤其以在while循环为主),根据时序计算,会导致串口收发功能异常宕机。
解决方法:
1.使用延迟函数,通常延迟20ms左右可以解决问题。
2.加入看门狗,当串口宕机时复位MCU。
------------------------------------------------------------------------------------------
其它情况
1.检查硬件是否正常
2.串口连接是否正确
3.若与上位机通信,检查串口转USB驱动是否安装
4.检查供电是否正常
5.使用ST-LINK进入调试模式进行调试
6.使用示波器查看波形异常