光怪鹿李 2024-03-11 21:45 采纳率: 88.9%
浏览 133
已结题

关于RS485 modbus通信挂载多个设备通信不稳定的问题

我用单片机的UART3连接一个sp3485芯片,利用485通信,485总线上挂载了四个485传感器,分别是采集PH,电导率,液位,和含氧量的四个传感器。

出现了以下问题
1.while循环中 其中有四行代码 ,分别是(1)采集PH,(2)采集液位高度 (3)采集液体电导率 (4)采集含氧量 这四行代码是分别封装的函数,里面的通信格式是用Modbus,用串口轮询方式HAL_UART_Transmist 发送指令给传感器,再用串口轮询接收HAL_UART_Receive方式接收传感器返回来的数据。
2.如果这四行代码中间不加延时的话 ,采集到的数据都会变成零,如果加20毫秒的延时,可以采集到液位高度和电导率,但是含氧量的为零。
3.如果增加到50毫秒的延时,就可以全部采集得到,但是,只能维持一天的时间左右,大概过了30个小时,单片机又会采集到全部都是零的数据,但是不是死机的状态,他其他程序还是可以运行,就是采不到数据。
折腾了好多天,都不知道是什么问题。

img


下面是我的硬件电路

img

img

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-11 21:46
    关注

    引自免费微信小程序:皆我百晓生

    针对您描述的问题,RS485 Modbus通信不稳定且数据采集不准确,可能存在以下几个原因,并相应地给出解决方案:

    1. 通信冲突:多个设备挂载在同一条RS485总线上时,如果在轮询请求和接收响应之间的时间间隔过短,可能会导致数据包碰撞。Modbus RTU协议规定了最小的帧间隔时间,通常为3.5个字符传输时间(包括停止位)。您可以尝试在每个传感器读取操作之后增加更合理的延时,例如根据波特率调整为3.5倍的字符传输时间。
    #define MIN_FRAME_INTERVAL_MS (3.5 * 1000 / UART_BAUDRATE) // 根据波特率计算合适的延时
    
    // ...
    
    HAL_Delay(MIN_FRAME_INTERVAL_MS);
    
    1. 硬件问题

      • 检查线路连接是否稳定可靠,尤其是终端电阻的配置是否正确,确保所有设备都具有匹配的终端电阻。
      • 验证电源供电是否稳定,+24V是否存在波动,可能导致传感器工作异常。
      • 检查SM712芯片及SP3485收发器的工作状态,看是否有信号反射、噪声干扰等问题。
    2. 软件问题

      • 确保UART的接收缓冲区大小足够容纳每次传感器返回的数据,避免数据溢出丢失。
      • 轮询接收数据时,可以采用超时机制判断传感器是否正常响应,若未收到有效响应则重试。
    3. 传感器固件或配置问题

      • 某些传感器可能在长时间连续工作后进入某种休眠模式或出现故障,需要查阅传感器手册检查是否有相关设置需要更改或定期复位命令。

    对于延时从20ms逐渐增大到50ms能暂时解决问题的情况,说明至少部分问题是由于延时不足引起的通信冲突。但过了大约30小时又出现问题,这可能与上述硬件或传感器固件问题有关。

    为了进一步排查问题,请按照以下步骤进行:

    • 在代码中添加日志功能,记录发送指令和接收到的响应数据,有助于分析具体哪个环节出现问题。
    • 对RS485通信线路上的信号进行示波器抓包分析,查看是否存在信号完整性问题。
    • 定期对传感器进行复位或者重新初始化,观察是否能改善长时间运行后的数据稳定性。

    此外,在实际应用中,为了避免串行通信中的冲突,还可以考虑使用RTU广播模式(如果有此功能)或TCP/IP上的Modbus-TCP来替代传统的点对点通信方式。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月28日
  • 已采纳回答 7月20日
  • 创建了问题 3月11日

悬赏问题

  • ¥15 基于ffmpeg 编码成yuv420p nv12的问题
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument