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芯片点坏了,换一个又好使了,所以点的时候一定要小心。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 RS485接收程序是针对STM32系列单片机的一种程序设计,用于实现RS485通信协议中的接收功能。 首先,RS485是一种电气标准,具有双向通信功能,可通过单个串行总线连接多个设备。在STM32单片机中,我们可以通过配置对应的GPIO引脚和串口控制器来实现RS485通信。 在编写RS485接收程序时,我们需要根据通信协议和硬件连接进行相应的配置和初始化。首先,配置GPIO引脚为输入模式,用于接收数据。其次,配置UART串口模式为接收模式,并设置波特率和其他相关参数。 接下来,我们可以使用中断或轮询的方式进行数据接收。如果选择中断方式,需要在初始化中开启对应的接收中断,并编写中断服务函数来处理接收到的数据。如果选择轮询方式,可以在主循环中不断检测接收缓冲区是否有数据到达,并进行相应的处理。 在接收到数据后,我们可以根据协议要求进行数据解析和处理。一般来说,RS485通信协议中会包含起始位、数据位、校验位等信息,我们可以根据这些信息对接收到的数据进行解析,判断数据的有效性,并可以根据需要进行处理,比如存储、显示或执行相应操作。 需要注意的是,在RS485通信中还需要进行相关的异常处理和错误处理。比如,在接收过程中可能会出现数据错误、负载变化等情况,我们需要在程序中加入相应的保护措施和容错处理,以提高通信稳定性和可靠性。 综上所述,STM32 RS485接收程序的实现需要根据具体的硬件连接和通信协议要求进行相应的配置和初始化,并编写相应的数据接收、解析和处理代码,同时还需要添加异常处理和错误处理的机制。这样才能有效地实现STM32单片机的RS485接收功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值