首先声明,我对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能够对你的注解(“关键是你没有延时无法判断什么时候是一个帧的开始和结束”)加以解释,“延时判断”真的很关键吗?谢谢!
转载
|