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

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

  1. win7计算机名怎么是感叹号,Win7连接wifi信号后出现感叹号三种原因和解决方法

    Win7系统电脑连接网络上网的方式有很多种,比如拨号.无线wifi.网卡等等,有时候网络也会出现故障问题.这不Win7连接wifi出现感叹号,并且提示有限的访问权限,且无法上网.有什么办法能解决,让w ...

  2. win7系统wifi没有网络连接到服务器,Win7无线Wifi无法连接怎么办?win7系统Wifi无法连接的三种故障原因及解决方法...

    当我们准备接入一个Wifi的时候,发现怎么样都连不进去,该怎么办呢?一般出现该问题基本是由于"WiFi密码不正确" ."Win7中保存的WiFi记录与路由器中不符&quo ...

  3. Windows系统解压zip文件之后乱码的问题的原因和解决方法

    我昨天用7zip压缩了一个压缩包给我同事,他那边显示的是乱码. 像下面这样. 具体的原因是: 7zip压缩zip格式的文件的时候,对文件名默认使用的是Windows系统的默认编码,我的系统的默认编码是 ...

  4. PHP中文乱码的三个原因及解决方法

    我们在做PHP项目的时候,经常会遇到中文乱码的问题,有时候编码问题还导致MYSQL的报错.中文乱码总共有三个原因 1:APACHE服务器设置导致乱码 2:PHP,或者HTML页面编码导致中文乱码 3: ...

  5. win7计算机名怎么是感叹号,Win7系统wifi信号后出现感叹号怎么办 Win7连接wifi后出现感叹号三种原因和解决方法...

    Win7连接wifi出现感叹号,并且提示有限的访问权限,且无法上网.有什么办法能解决,让win7系统能够正常连接网络呢?针对Win7连接wifi信号后出现感叹号的问题,下面脚本之家的小编给大家讲解具体 ...

  6. Java读带有BOM的UTF-8文件乱码原因及解决方法(转)

    转载:http://www.linuxidc.com/Linux/2012-12/76707.htm 最近在处理文件时发现了同样类型的文件使用的编码可能是不同的.所以想将文件的格式统一一下(因为UTF ...

  7. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...

    原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...

  8. 计算机键盘字母乱码,电脑键盘乱码怎么办 电脑键盘乱码原因及解决方法

    台式电脑比起笔记本电脑笨重.不易携带,但是台式电脑仍有笔记本无法替代的优点,特别对于游戏玩家而言,台式电脑更能带动一些大型游戏,且游戏体验感更足.但是使用键盘的时候也会遇到一些问题,就有用户反映说自己 ...

  9. Java读带有BOM的UTF-8文件乱码原因及解决方法

    Java读带有BOM的UTF-8文件乱码原因及解决方法 Java读带有BOM的UTF-8文件乱码原因及解决方法 - daimojingdeyu - ITeye技术网站 Java读带有BOM的UTF-8 ...

  10. ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法

    ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 参考文章: (1)ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 (2)ht ...

最新文章

  1. Leetcode 347. Top K Frequent Elements--python1行解法,Java 11ms解法
  2. .NET连接SAP系统专题:C#获取RFC中自定义的异常(四)
  3. 2021-11-16数据结构
  4. 用matlab画大数据曲线_基于MATLAB的大数据分析
  5. g++ linux 编译开栈_linux gcc和g++版本的修改
  6. mysql 8.0.25 取巧解决修改密码报错问题
  7. 3D空间中射线与三角形的交叉检测算法
  8. java math rint_Java Math rint() 使用方法及示例
  9. mac maven安装与配置镜像
  10. python 图表控件_10款好用的.NET图表控件推荐
  11. 连续时间傅立叶变换和拉普拉斯变换
  12. 华为服务器显示器蓝屏怎么办,华为交换下误接TP-LINK交换导致监控画面蓝屏的解决方案...
  13. 5、passcode
  14. HTML+JS+websocket 实现联机“游戏王”对战(一)
  15. 13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置
  16. Rockchip_Developer_Guide_USB_FFS usb测试demo
  17. Docker容器技术(三)
  18. 分销小程序定制开发|分销系统开发对商家有哪些好处?
  19. echarts柱状图数值差异过大和最小值无法选中的问题解决
  20. API开放赋能,打造DING功能快速抢占上亿用户

热门文章

  1. 《Region Proposal by Guided Anchoring》阅读笔记
  2. 修改tomcat的临时文件夹_解决:tomcat重新部署会删除临时文件以及临时文件夹
  3. 【MATLAB】NSGA-2优化算法整定PID控制器参数(四)—— 一阶带时延的被控对象
  4. 超高分辨率大屏拼接工作站硬件选型
  5. 百度地图自定义图标偏移问题
  6. 在Panda3d中转换Maya模型为egg格式并使用pview查看
  7. FA_MASS_ADDITIONS Interface Table 资产成批增加
  8. 2021-07-16思考-资本源于贪婪(与人性抗争)
  9. 配置java comp路径_java:comp/env/jdbc/ 的两种配置方法
  10. 误入 GitHub 游戏区,意外地收获颇丰