| “其实STM32也有其优势.......在不需要UART的地方都用STM32”,这是不是说没有FIFO的UART很不好用? 
 试想要传送100个字节,如果通过一个深度为16字节的FIFO,则至少要中断7次才能传送100个字节;如果使用DMA,则只需在传送结束时中断一次。哪个更高效?
 
 
 对于Modbus RTU这样的协议,使用DMA也不会比使用FIFO效率低:
 
 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的效率更高!
 
 |