printf使用485输出时,频繁切换收发脚导致乱码

项目场景:

stm32单片机printf输出打印是,使用了mx485芯片输出。


问题分析

由于485多了一个收发控制开关每次在收发的时候都需要切换。

485在数据量传输过程中,在对寄存器写前打开485发送,写后关闭发送。而使用了printf输出,每次都是一个一个字节的发送。
这里由于收发控制位频繁的在切换,收到的数据会丢失,出现乱码。由于单片机到485芯片之间的数据传输需要一定的时间,在单片机发送完成后,485未必完成了转换并发送完成,这个时候单片机就进行收发切换,会导致每个字节最后的一位会丢失,出现乱码的现象。这里就需要单片机进行一定的延时后再切换485的收发。

printf重定向后的代码

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

PUTCHAR_PROTOTYPE
{
	P_485RW(1);//485写
	USART_SendData(PRINT_USARTx, (unsigned char) ch);// 发送
  	while (!(PRINT_USARTx->SR & USART_FLAG_TXE));//数据传输完毕
	P_485RW(0);//485读
  	return ch;
}

解决方案:

解决方案:在寄存器发送完成后,再打开usart的发送中断(USART_IT_TC),这样可以到串口中断里去处理485收发切换。


#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
PUTCHAR_PROTOTYPE
{
	P_485RW(1);//485写
	USART_SendData(PRINT_USARTx, (unsigned char) ch);
    while (!(PRINT_USARTx->SR & USART_FLAG_TXE));//数据传输完毕
	USART_ITConfig(PRINT_USARTx,USART_IT_TC,ENABLE);
	
  return ch;
}

void PRINT_USARTx_IRQHandler(void)
{
	if(USART_GetITStatus(PRINT_USARTx, USART_IT_TC) != RESET)//串口发送中断
	{
//		USART_ClearITPendingBit(PRINT_USARTx, USART_IT_TC);
//		USART_ClearFlag(PRINT_USARTx,USART_IT_TC);
		//关闭发送完成中断
		USART_ITConfig(PRINT_USARTx, USART_IT_TC, DISABLE);//关闭发送
		USART_ITConfig(PRINT_USARTx, USART_IT_RXNE, ENABLE);//使能接收脚
		P_485RW(0);//485读
	}
}

由于多了一步串口的操作,确认了单片机TDR寄存器的数据发到移位寄存器中,并且移位寄存器已经发送完成(USART_IT_TC置"1")。这个时候再关闭发送中断,关闭485发送。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值