项目场景:
基于RT1052单片机485通信问题。
问题描述:
在最近做的项目中,需要使用485协议实现单片机与传感器通信。但是在通信的过程中,单片机只能发送数据,不能接收数据,单片机发送完成数据还有,可以通过示波器看到,传感器做了相应的回应。但是就是不能接到传感器的应答数据。
系统中,485的使能状态默认为接收,程序中如果需要发送数据,可以直接拉高控制引脚,使能发送,数据发送完成后,再拉低控制引脚,使能接收。代码如下。
while(len--)
{
_485_2_Send
LPUART_WriteByte(base, (uint8_t)*(data++));
while (!(base->STAT & LPUART_STAT_TDRE_MASK));
_485_2_Resive
}
原因分析:
问题分析:主要从这个几个方面考虑,①:数据就没有发出来,需要验证数据到底有没有发出来。②:传感器问题,传感器接收到数据,就没有做回应,所以单片机根本就不会接收到数据。③:单纯只是单片机不能接收数据。接收程序有问题。所以直接从这几个方面一一验证,分析问题到底发生在哪里。
经过多次。发现使用示波器可以看到传感器是有数据发送出来的,只是单片进不能接收数据。至此,可以确定问题在单片机程序上。
经过实验验证,RS-485通信是需要考虑半双工延时的。延时的时间也是根据波特率的不同而不同。延时的取值一般取2/baudRate左右,可以根据调试,找到合适的延时时间。
解决方案:
最后经过调试,最终的程序如下:
while(len--)
{
_485_2_Send
_485_delay(5000);
LPUART_WriteByte(base, (uint8_t)*(data++)); //执行发送
while (!(base->STAT & LPUART_STAT_TDRE_MASK));
}
_485_delay(5000);
_485_2_Resive