WiFi通信字节乱码问题的产生原因及解决方法

WiFi简单通信文章中有个通信中每次数据开头出现乱码的bug,经过排查发现是demo程序中的逻辑问题。

产生原因:

要了解产生原因,首先要知道HAL_UART_Receive_IT()函数的执行机制——stm32每次执行此函数是为下一次的接收做准备,所以说在main函数前执行HAL_UART_Receive_IT(&huart1,my_re_buf1,1),当huart1接收到数据时,stm32将数据第一个字节存入my_re_buf[0]这个位置,然后执行串口接收中断回调函数HAL_UART_RxCpltCallback()里的HAL_UART_Receive_IT为下一次接收做准备。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart==&huart1)
	{	
		HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1);			
	}
		if(huart==&huart2)
	{	
		HAL_UART_Receive_IT(&huart2,&my_re_buf2[++pt_w2],1);
	}
}

接收中断回调函数,将数据存储完后才会执行这个函数。

	if(htim==&htim4)
	{
		
		t4_count++;
		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);

			while(pt_r1<pt_w1 )
		{
			HAL_UART_Transmit(&huart2,&my_re_buf1[pt_r1++],1,1000);
			
		}
		if(pt_r1>=pt_w1)
		{
			pt_w1=pt_r1=0;
	
		}
	}

按照这个代码逻辑执行并分别发送“abc”、“123”会出现下图这种情况:
在这里插入图片描述
为什么第二次发送的字符串“123”的第一个字节‘1’会出现在数组最后面?
在第一个字符串“abc”最后一个字符‘c’接收完成后会进入接收中断回调函数,这个时候pt_w1等于2,因此执行HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1)后再接收的下一个字节‘1’会存在my_re_buf1[3]这个位置,虽然定时器中断函数中将pt_w1置零,但是这并不会对HAL_UART_Receive_IT函数产生影响。
为什么发送第二个字符串的时候数据第一个数据时‘a’不变?
数组下标为0的空间第一次接收到数据后,在后期执行都无法对其修改,因为pt_w1每次赋值为0,但是HAL_UART_Receive_IT()函数中执行++pt_w1(每次从my_re_buf[1]的位置开始存数据)。因此在正常执行程序的时候串口助手接收到板子发来的数据第一个字节都是与本次数据无关的字符。

解决方法:

if(pt_r1>=pt_w1)
		{
			pt_w1=pt_r1=0;
			HAL_UART_AbortReceive_IT(&huart1);
			HAL_UART_Receive_IT(&huart1,my_re_buf1,1);
	
		}

将定时器中断函数中添加这两行代码,程序将pt_w1和pt_r1置零之后通过HAL_UART_AbortReceive_IT()函数将串口接收功能关闭,然后通过HAL_UART_Receive_IT()函数再次打开接收中断并把下一次接收存储位置设为my_re_buf[0]。

原文链接: https://www.jhxblog.cn/article/?articleid=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

举个锤子²³³³

有钱的捧个钱场,没钱的借去

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值