最近在搞这个Modbus协议,由于485协议是半双工的,区别于RS 232的全双工,考虑不周导致调试modbus协议时候出了不少问题。
第一,大多数开发板上的485芯片是MAX485,发送和接收状态的切换是通过IO给到这个两个引脚不同的电平进行切换,由于你的软件程序跑的太快了,写程序给485芯片进行接收或发送时切换注意加点延时等待一下。
/*加短暂延时,保证MAX485芯片转发数据完毕*/
Delay(0xFFFF);
// 使能接收数据
RS485_RX_EN() ;
第二,485数据使用DMA串口发送出现数据丢失的话。
1.排查DMA传输的BUFF不要是栈空间的临时变量BUFF,要使用全局的定义BUFF,否则很容易出现生命周期问题,DMA还没传输完成,内存就给回收了。
2.注意是不是DMA还没传输完成,就把485芯片的发送状态切换成了接收状态,实测DMA传输完BUFF的数据相对还是比较慢的,尤其数据量大的时候。同样485芯片进行接收或发送时切换时注意等待DMA传输完成在进行切换,此处可以利用DMA中断完成。
//等待DMA传输完成,否则数据较长的话丢数据
while(uart2_dma_tx_complete != 1){};
uart2_dma_tx_complete=0;