RS-485程序只能发送不能接收

在RT1052单片机的485通信项目中,遇到只能发送无法接收数据的问题。通过示波器确认数据已发送且传感器有响应,但单片机无法接收。分析可能原因包括数据未发出、传感器故障及单片机接收程序错误。最终发现是缺少半双工通信的延时导致。在发送和接收之间添加适当延时后,单片机成功接收到了传感器的应答数据。
摘要由CSDN通过智能技术生成

项目场景:

基于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值