在CubeMx生成代码时,默认为 HAL 库,但也可以指定为 LL库,LL库基本是直接操作寄存器,功能较为单一,但是效率更高。串口使用HAL如果每次接收一个字次,由于HAL库的效率,容易丢包,若一次性接收多个字节,又需要固定的字节数。

于是这次使用了 LL 库,在LL库中:
LL_USART_TransmitData8(); 为发送一个字节函数,通过查看定义可知,它直接操作了DR寄存器,所以效率很高。

这次想设计一个简单的程序:当收到字符A的时,发送字符E,但是发现居然有丢包的现象,这是由于程序逻辑问题导致的,这也是库函数使用者对寄存器操作不熟悉的原因,最后调整程序如下:

  while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */static uint8_t recv;if(USART1->SR&(1<<5))                          //如果接受到数据{recv = LL_USART_ReceiveData8(USART1);      //读取数据if(recv == 'A')                            //如果是字符A{LL_USART_TransmitData8(USART1,'E');     //发送字符Ewhile((USART1->SR&0X40)==0);            //等待数据发送完成}}/* USER CODE BEGIN 3 */}

上文程序不断的轮询,判断是否接受到数据,再进行值的读取,将数据发送出去以后,等待数据发送完成,经测试效果稳定:

可以看到,100B/s 的速度发送了近4万个字节,也接到同样的数据,说明程序未丢包。

如果把 recv = LL_USART_ReceiveData8(USART1),移出if语句,如下:

// !!错误代码示例while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */static uint8_t recv;recv = LL_USART_ReceiveData8(USART1);          //读取数据if(USART1->SR&(1<<5))                          //如果接受到数据{if(recv == 'A')                           //如果是字符A{LL_USART_TransmitData8(USART1,'E');    //发送字符Ewhile((USART1->SR&0X40)==0);           //等待数据发送完成}}/* USER CODE BEGIN 3 */}

即未接收到新的数据,也不断的读取DR的值,程序测试会出现比较频繁的丢包。


可以看到,同样的数据发送,241个字节,才收到92个字节,丢包严重。原因可能是频繁的调用LL_USART_ReceiveData8()(读取DR的值),导致串口外设一直忙碌,最后导致了丢包。

STM32 LL库串口丢包问题与解决相关推荐

  1. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  2. STM32 HAL库串口同时收发,接收卡死?

    STM32 使用 HAL库串口同时收发,使用踩坑史 = =!......by 矜辰所致 目录 前言 一. HAL 库串口收发 1.1 串口发送 1.2 串口接收 1.2.1 标准库接收 1.2.1 H ...

  3. STM32 HAL库 串口DMA接收不定长数据

    STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...

  4. STM32 HAL库串口收发数据

    STM32 HAL库串口收发数据 许多传感器的使用方法是:单片机给传感器发送一帧数据,然后传感器返回单片机一帧有用数据,所以串口的收发功能十分重要. STM32cubeMX的配置 时钟和下载方式就不讲 ...

  5. linux6.5系统间歇性丢包,路由器经常丢包、掉线解决方法大全

    路由器老掉线是经常出现的问题,你上网都可能遇到:丢包.上网慢.掉线.上不去网.不能浏览网页.卡.信号差.误码率高.信号延迟.连接失败.不稳定.上不去.死机.无故中断等现象,这到底是怎么回事,如何解决这 ...

  6. 某公司R2631E以太口通过SDH接新桥的ATM交换机,出现丢包问题的解决方法

    某公司R2631E以太口通过SDH接新桥的ATM交换机,出现丢包问题的解决方法 问题描述 某电力公司R2631E的以太口通过SDH接新桥的ATM交换机,出现丢包的情况,display int e 1 ...

  7. 数据丢包怎么修复_网络丢包率如何解决

    网络丢包率如何解决 网络丢包是我们在使用 ping (检测某个系统能否正 常运行) 对目站进行询问时, 数据包由于各 种原因在信道中丢失的现象. ping 使用了 ICMP 回送请求与回送回答报文. ...

  8. 以太网 TCP协议交互过程中出现丢包时的解决机制,超时重传、快速重传、SACK与DSACK

    2.7.3 以太网 TCP协议(TCP交互过程中出现丢包时的解决机制-列举部分) 参考:CSDN_TCP的重传机制_博主.Pr Young,对描述进行了整理与结合个人的理解进行编写. 一.超时重传机制 ...

  9. TCP丢包原因、解决办法

    TCP是基于不可靠的网络实现可靠的传输,肯定也会存在掉包的情况,如果通信中发现缺少数据或者丢包,那么,最大的可能在于程序发送的过程或者接收的过程出现问题. 例如服务端要给客户端发送大量数据,Send频 ...

  10. wifi丢包率高怎么解决_网络Ping延时高怎么办 网络丢包高怎么解决

    电脑打开网页慢怎么办?利用Ping检测网络时延时高怎么解决呢?小编最近在玩LOL时出现Ping延时高的情况,导致游戏界面非常卡,打开网页时也显得很慢,由于使用笔记本电脑无线网卡来连接外网,因此可以通过 ...

最新文章

  1. Java内存模型(Java Memory Model,JMM)
  2. SVM支持向量机-手写笔记(超详细:拉格朗日乘数法、KKT条件、对偶性质、最优化、合页损失、核函数...)
  3. 2021.08.23学习内容Pytorch与Torch的关系以及Torchvision作用
  4. 基于Redis的微博计算好友关系
  5. C++RAII惯用法:C++资源管理的利器
  6. HBase region的split过程浅析
  7. 【图像配准】基于matlab SIFT图像配准【含Matlab源码 148期】
  8. Hibernate简介与运行原理
  9. Java中级工程师面试题
  10. 1200兆路由器网速_水星MAC1200R千兆版评测/无线性能测试-路由器交流
  11. W25Q64内部结构
  12. 数字版权管理 (DRM)
  13. gcc编译工具集中各软件的用途,了解EFF文件格式
  14. 派克宇航获得AVIC涡轮螺旋桨支线飞机MA700的飞控作动系统合同
  15. jquery ajax封装通用方法
  16. realsense中IMU的简单使用与学习
  17. 5G时代金融服务如何升级?网易云信助力银行数字化建设
  18. pta mysql 训练题集 ( 61-80 )
  19. Python 中 PyQuery 库
  20. 30w+粉丝的程序员给你白漂:这些都是我常用的在线工具网站(合集)

热门文章

  1. 路飞学城mysql练习
  2. C++编写红警3 1.12版本修改器
  3. 51单片机精确延时程序(晶振12MHz,一个机器周期1us.)
  4. 【22年新版】软件工程专业的各阶段的学习方法
  5. python 节气_Python开源日志01:pyGregorian2LunarCalendar公历农历转换、阳历阴历转换、二十四节气计算...
  6. 证件照尺寸及背景颜色值
  7. t检验和wilcoxon秩和检验 判断两组数据间的显著性差异
  8. 安装和使用Entrez Direct
  9. 最牛最新奶粉事件“争抢奶粉互殴”值得我们大家去深思
  10. 天宇优配|医药股反弹受阻 公募乐观态度不改