STM32 485数据接收异常调试指南

问题描述

stm32f407与传感器通过485总线进行通信,stm32向传感器发送索要数据的指令,传感器本应传回的数据为0x01 0x03 0x02 0x04 0x7E 0x3A 0xA4,实际接收到的数据为0x40 0x20 0x20 0x90 0xE9 0xA4 0x00。像是被485芯片修改过一样。485芯片部分电路图如下:

以上是正点原子开发板的电路图,与本文分析的案例电路图类似。

问题排查

排查方向1

因为每次stm32发数据前要拉高RE引脚,发完数据再拉低RE引脚,所以开始怀疑是不是发送完数据RE引脚拉的太慢了,导致接收的数据不完整。发送代码如下:

RS485_RST(1);
HAL_UART_Transmit(&uart_handle, (uint8_t *)buf, len, HAL_MAX_DELAY);
RS485_RST(0);

然后用示波器通道1测485芯片RE脚,通道2测485芯片A脚,发现RE拉高的瞬间就有发送信号了,发送信号发送完成之后的瞬间RE引脚就被拉低了,而且可以看到RE脚被拉低了一段时间后A脚上才有的传感器发送的信号,所以证明不是RE引脚拉的太慢的问题,而且示波器测量结果证明这段代码拉RE引脚的速度是非常快的。

排查方向2

是不是代码有问题,对接收到的数据处理有错误。
为了验证这个问题,笔者用到了USB转TTL模块,如下:

把它的GND与开发板相连,RXD接上一条线,连接在485芯片的DI引脚上,用串口调试助手打印DI引脚上的数据,打印出来的是0x40 0x20 0x20 0x90 0xE9 0xA4 0x00,所以证明软件编写没有问题。

排查方向3

会不会是电路有问题
接下来找来一个UT-8890,外观如下:

把他的T/R+脚连在485芯片的A脚上,T/R-脚连在485芯片的B脚上,GND链接开发板的GND,UT-8890要安装驱动,使用说明书在以下链接:
UT-8890使用说明书
连接好之后,电脑上用串口调试助手发送和接收UT-8890数据,发现stm32发送的数据串口调试助手接受不到,串口调试助手发送0x01 0x03 0x02 0x04 0x7E 0x3A 0xA4,stm32打印接收到的数据为0x40 0x20 0x20 0x90 0xE9 0xA4 0x00
如果串口调试助手一直发0x01,发现stm32十次大概有一次打印出来接收到的数据为0x01 0x00,其他都是0x40,所以开始怀疑是硬件问题,经过进一步排查发现,原来是以下标出的这个电阻没焊好

后记

这个电阻没焊好会导致485芯片AB线接收到的数据与转发到DI引脚上的数据不一致,用示波器肉眼读会觉得基本一致,但是用器件读就会发现不一致,像是数据被改过或者程序有问题一样。
本来485芯片只是接收数据有修改现象,后来电阻焊好之后,485芯片接收数据正常了,发送数据又发送不出去了,经过排查是因为在测试的过程中,用示波器的探针、或USB转TTL的线点485芯片的时候,把485芯片点坏了,换一个又好使了,所以点的时候一定要小心。

作者:inputA

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 485数据接收异常调试指南

发表回复