失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > WiFi通信字节乱码问题的产生原因及解决方法

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

时间:2021-10-04 17:17:43

相关推荐

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]。

原文链接:/article/?articleid=2

如果觉得《WiFi通信字节乱码问题的产生原因及解决方法》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。