查看: 1452|回复: 0
打印 上一主题 下一主题

关于使用STM32的USART模块实现Modbus协议的讨论

[复制链接]
跳转到指定楼层
沙发
发表于 2015-5-20 08:30:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先声明,我对Modbus不熟悉,尤其是如何实现它,最近才从网上下载了协议研究了一下,特此向高手请教。搞清楚这些问题,才能有效地在芯片中实现相应的功能,满足大家的需要。

此帖的目的是继续另一帖的讨论:建议STM32的芯片加上串口超时功能,很好用的一个功能

这里是我的实现描述:
Modbus的请求数据包都是由下面几部分构成:
一、从机地址;固定为一个字节
二、功能代码;固定为一个字节
三、功能参数;长度依不同功能代码而不同
四、数据域;长度在功能参数中定义
五、校验码;固定为两个字节

下面以功能代码=0x03的数据包交换说明如何使用STM32进行数据传送:
1、主机发送8字节:
  从机地址:  1字节
  功能代码:  1字节 = 0x03
  起始地址:  2字节
  读取数目:  2字节 = N
  CRC校验码: 2字节
2、从机先接收2字节,当得知功能代码为0x03时,再继续接收6个字节
3、从机发送 N*2+4字节 = (1字节功能码+1字节数据长度+N*2字节数据+2字节校验码)
4、主机接收从机发出的(N*2+4)字节数据。因为主机知道N的数值,所以主机知道从机响应的数据包的长度

这里可以看到,如果没有FIFO,需要在上述第2阶段从机接收主机请求时分为两个步骤进行;而在其他的阶段使用DMA的效率不比使用FIFO差,而且在第4阶段,如果数据包长度大于FIFO深度时,使用DMA的效率更高!

根据我的理解,Modbus协议是主从结构,即主机发送请求给从机,从机收到请求后根据要求返回主机需要的数据或状态。主机的发送和接收都是主动的,它随时知道发送或接收数据的长度;而从机的发送是被动的,只有在接收到主机的请求后才能发送指定的数据或状态。

因此,主机没有必要通过超时检测来判断帧的开始和结束。对于从机讲,在接收第一个请求帧时,它一定知道帧的开始,同时根据我上面描述的步骤,它也可以很容易的知道帧的结束。既然可以判断出第一个帧的开始和结束,那么随后的帧就不难区分了。

所以,我希望makesoft能够对你的注解(“关键是你没有延时无法判断什么时候是一个帧的开始和结束”)加以解释,“延时判断”真的很关键吗?谢谢!



转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表