在进行基于 STM32 的串口转 485 通信(Modbus)时,需要注意以下几个问题:
modbus485通信就是简单的一呼一应的通信(主机呼叫,从机响应(也不可以响应,但是不会阻塞))。
- 硬件连接:确保 STM32 UART与 485 转换器之间的连接正确,包括串口引脚的连接和 485 总线的连接。同时,注意 485 总线的终端电阻的配置。
- 波特率和数据格式:设置 STM32 的串口波特率、数据位、停止位和校验位等参数与 485 设备相匹配。
- Modbus 协议:了解 Modbus 协议的规范,包括功能码、寄存器地址、数据格式等。确保按照协议要求进行数据的发送和接收。
- 地址设置:为每个 485 设备设置唯一的地址,以便在通信中正确识别和寻址。
- 数据校验:使用适当的校验方式(如 CRC 校验)来确保数据的完整性和准确性。
- 中断处理:合理处理串口接收中断,及时读取和处理接收到的数据。
- 错误处理:添加错误处理机制,以处理通信中的异常情况,如超时、CRC 错误等。
- 多设备通信:如果需要与多个 485 设备进行通信,需要考虑设备的轮询和并发处理。
- 电气隔离:在某些情况下,可能需要进行电气隔离,以防止不同设备之间的干扰。
- 测试和调试:进行充分的测试和调试,包括单个设备的测试和多设备的集成测试,确保通信的稳定性和可靠性。
讲下我在项目种遇到的问题:
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里判断不同计数值呼叫不同的设备。这样既保证了指令的准确性又可以让系统不用延时而保证实时性。