关于485收数据的问题

关于目前做的一个stm32的项目中发现485发送的数据总是接收不到的问题

问题分析

软件方面:通过初始化引脚拉高拉低来发送数据,通过中断来接收数据
硬件方面:采用 SP485芯片

问题现象:485总能正常的发送数据,但是由一个主机发往从机的数据总有概率接收不到,一主机一从机时发送数据接收不到的概率大概为 三分之一,具体是第一个字节数据丢失,发送给两个从机数据的间隔为 250ms,第一个字节丢失的概率就变得很高可能为百分之50;

附上代码和现象
void Ex_485_Send(char *buf, int len)
{
	int i;
	char *p_buf = buf;
	ex_rs422_recv_point=0;
	GPIO_SetBits(GPIOC, GPIO_Pin_3);
	Delay_ms(5);
	for(i=0 ; i<len; i++)
	{
		UART2_Send(*p_buf);

  		p_buf++;
	}
		Delay_ms(5);
	GPIO_ResetBits(GPIOC, GPIO_Pin_3);
	//_recv_point=0;
	//_recv_index=0;
}
void Ex_485_Recv(void)
{	
	u8 uData;
	
	if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
	{
		uData = (u8)USART_ReceiveData(USART2);
		g_rs485_cnts=0;
		ex_rs422_recv_buf[ex_rs422_recv_point++] = uData;
		if(ex_rs422_recv_point==EX_BUF_SIZE)
			ex_rs422_recv_point = 0;
	}
//	putchar('a');
}
注:发送间隔为250ms,接收用的是20ms一次的定时器
从机代码为如果接收到数据立刻发出

查阅过很多资料,发现可能是芯片在发送的时候如果接收中断可能会导致芯片来不及反应,我在从机接收数据之后加上了延时 50ms 处理,但是结果依然不尽如人意,现在目前问题正在解决中,期待解决

##更新
原因找到了,就是这5ms的锅,由于我是在定时器中做的收发485的动作,所以加了这5ms的延时会导致程序及其不稳定,去掉延时并且收发数据改为串行,这样效率和成功率都有极大的改善

版权声明:本文为CSDN博主「护驾!!!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47277566/article/details/122324668

关于目前做的一个stm32的项目中发现485发送的数据总是接收不到的问题

问题分析

软件方面:通过初始化引脚拉高拉低来发送数据,通过中断来接收数据
硬件方面:采用 SP485芯片

问题现象:485总能正常的发送数据,但是由一个主机发往从机的数据总有概率接收不到,一主机一从机时发送数据接收不到的概率大概为 三分之一,具体是第一个字节数据丢失,发送给两个从机数据的间隔为 250ms,第一个字节丢失的概率就变得很高可能为百分之50;

附上代码和现象
void Ex_485_Send(char *buf, int len)
{
	int i;
	char *p_buf = buf;
	ex_rs422_recv_point=0;
	GPIO_SetBits(GPIOC, GPIO_Pin_3);
	Delay_ms(5);
	for(i=0 ; i<len; i++)
	{
		UART2_Send(*p_buf);

  		p_buf++;
	}
		Delay_ms(5);
	GPIO_ResetBits(GPIOC, GPIO_Pin_3);
	//_recv_point=0;
	//_recv_index=0;
}
void Ex_485_Recv(void)
{	
	u8 uData;
	
	if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
	{
		uData = (u8)USART_ReceiveData(USART2);
		g_rs485_cnts=0;
		ex_rs422_recv_buf[ex_rs422_recv_point++] = uData;
		if(ex_rs422_recv_point==EX_BUF_SIZE)
			ex_rs422_recv_point = 0;
	}
//	putchar('a');
}
注:发送间隔为250ms,接收用的是20ms一次的定时器
从机代码为如果接收到数据立刻发出

查阅过很多资料,发现可能是芯片在发送的时候如果接收中断可能会导致芯片来不及反应,我在从机接收数据之后加上了延时 50ms 处理,但是结果依然不尽如人意,现在目前问题正在解决中,期待解决

##更新
原因找到了,就是这5ms的锅,由于我是在定时器中做的收发485的动作,所以加了这5ms的延时会导致程序及其不稳定,去掉延时并且收发数据改为串行,这样效率和成功率都有极大的改善

版权声明:本文为CSDN博主「护驾!!!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47277566/article/details/122324668

生成海报
点赞 0

护驾!!!

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

ESP32-GY_30光照强度传感器

GY_30光照强度传感器介绍 GY-30光强传感器特点及使用介绍 一、连接引脚 GY_30光照强度传感器使用I2C传输数据 。 5根引脚,名称与功能如下; vcc 为外接供电电源输入端 GND 地线 SCL I2C通信模式时钟

初学STM32之串口通信

一、背景知识 1. 处理器与外部通信的两种方式 并行通信:数据各个位同时传输 优点速度快;缺点占用引脚资源多串行通信:数据按位顺序传输 优点占用引脚资源少;缺点速度慢 2.串行通信的