基于STM32的串口转485通信(modbus)需要注意的问题

在进行基于 STM32 的串口转 485 通信(Modbus)时,需要注意以下几个问题:

modbus485通信就是简单的一呼一应的通信(主机呼叫,从机响应(也不可以响应,但是不会阻塞))。

  1. 硬件连接:确保 STM32 UART与 485 转换器之间的连接正确,包括串口引脚的连接和 485 总线的连接。同时,注意 485 总线的终端电阻的配置。
  2. 波特率和数据格式:设置 STM32 的串口波特率、数据位、停止位和校验位等参数与 485 设备相匹配。
  3. Modbus 协议:了解 Modbus 协议的规范,包括功能码、寄存器地址、数据格式等。确保按照协议要求进行数据的发送和接收。
  4. 地址设置:为每个 485 设备设置唯一的地址,以便在通信中正确识别和寻址。
  5. 数据校验:使用适当的校验方式(如 CRC 校验)来确保数据的完整性和准确性。
  6. 中断处理:合理处理串口接收中断,及时读取和处理接收到的数据。
  7. 错误处理:添加错误处理机制,以处理通信中的异常情况,如超时、CRC 错误等。
  8. 多设备通信:如果需要与多个 485 设备进行通信,需要考虑设备的轮询和并发处理。
  9. 电气隔离:在某些情况下,可能需要进行电气隔离,以防止不同设备之间的干扰。
  10. 测试和调试:进行充分的测试和调试,包括单个设备的测试和多设备的集成测试,确保通信的稳定性和可靠性。

讲下我在项目种遇到的问题:

1、485总线设备上挂载好几个485设备,采用轮询的方式对设备进行读写,但是有时会有呼叫设备不响应的问题,可能呼叫5次才会响应一次。

        然后我以为是设备响应时间过长了,所以在呼叫之后加延时10ms,再读取,可是依旧没有解决,然后我用一个计数值,在while()循环里计数到不同的数值再分别呼叫不同的设备,比如计数到200,呼叫1号设备,计数到400呼叫到2号设备,计数到600,呼叫3号设备,这样还是没有解决。

然后我用485转串口将485总线上数据(也就是串口传送到485总线上数据)返回到电脑端的串口助手查看,modbus指令的、功能码、操作码、校验码等都是没有错误的。

      这就很奇怪了 ,然后我用串口助手的增加时间戳和分包显示的功能来查看,果真出现了问题,

就是你呼叫1号设备的时候,1号设备立即响应,1号设备会发送信号到总线上,然后你的串口又继续发送了呼叫2号设备modbus指令到485总线上,这里两帧数据的间隔过于小,所以就会造成对485设备来说,这就是一帧数据。所以就不响应。

        解决办法:

1、两个呼叫命令之间增加延时50ms,测试过有用,但是这种在逻辑代码上增加延时的函数会让cpu处于空转的状态,造成cpu资源的浪费,而且也会让系统的实时性太差。所以不太建议。

2、用定时器中断计数的方法,定时周期为50ms,每次进入定时器中断计数+1;然后在while里判断不同计数值呼叫不同的设备。这样既保证了指令的准确性又可以让系统不用延时而保证实时性。

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值