当前位置: 首页 > news >正文

单片机开发常见问题集合

文章目录

  • 发送串口数据偶尔丢失字节

发送串口数据偶尔丢失字节

场景: 在STM32单片机中进行串口数据发送,在Linux/Windows上进行串口数据接收,会偶发出现接收到的数据有某些字节丢失。
分析: 在STM32中可以使用printf用于发送串口数据,该函数内部实际上调用了接口:

/********************************************************************** @fn      fputc* @brief   Support Printf Function * @param   data - UART send Data.   * @return  data - UART send Data.*/
int fputc(int data, FILE *f)
{
#if (DEBUG == DEBUG_UART1)while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);USART_SendData(USART1, (u8) data);
#elif (DEBUG == DEBUG_UART2)while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);USART_SendData(USART2, (u8) data);	
#elif (DEBUG == DEBUG_UART3)while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);	USART_SendData(USART3, (u8) data);	
#endifreturn data;
}

解决:

  • 方案1:修改fputc内部实现
int fputc(int data, FILE *f)
{
#if (DEBUG == DEBUG_UART1)USART_SendData(USART1, (u8) data);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
#elif (DEBUG == DEBUG_UART2)USART_SendData(USART2, (u8) data);while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
#elif (DEBUG == DEBUG_UART3)USART_SendData(USART3, (u8) data);while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);	
#endifreturn data;
}
  • 方案2:业务中不使用printf函数,使用自行实现接口
/*** @brief 发送字节流到串口* @param bytes 字节流数据* @param length 字节流长度*/
static void UART1_SendBytes(const uint8_t* bytes, uint32_t length)
{uint32_t i;for (i = 0; i < length; ++i){USART_SendData(USART1, bytes[i]); /* CPU 将一个字节转入到 发送数据寄存器 */while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); /* 等待 发送数据寄存器 将该字节全部转入到 发送移位寄存器 */}while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); /* 等待 发送移位寄存器 将数据帧的最后一个字节的最后一位发送出去,整个数据帧发送完毕 */
}
http://www.lryc.cn/news/247363.html

相关文章:

  • Matlab 点云曲率计算(之二)
  • C++11的原子变量
  • 北京交通大学 计算机网络体系与协议(研) 考试试卷
  • python之pyqt专栏7-信号与槽3
  • 高噪点灰度图目标粗定位CoraseLocation
  • Android:Google三方库之Firebase集成详细步骤(二)
  • java使用freemarker模板生成html,再生成pdf
  • 图解系列--Web服务器,Http首部
  • 直线(蓝桥杯)
  • Android:从源码看FragmentManager如何工作
  • LabVIEW通过编程将图形类控件的X轴显示为时间戳
  • Spring Boot进行单元测试,一个思路解决重启低效难题!
  • c/c++ header_only 头文件实现的关键点
  • Linux(CentOS7.5):通过docker安装redis
  • 唯创知音WT588F02B-8S语音芯片:灵活更换语音内容,降低开发成本与备货压力
  • git的创建以及使用
  • 面试笔记--Linux常用命令
  • 【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念(内核任务中断)、与硬件的关系实现
  • 在easyswoole 中,配置文件如何加载外部配置
  • 小程序微信支付API?以及参数有哪些
  • 【算法】一个简单的整数问题(树状数组、差分)
  • Android flutter项目 启动优化实战(二)利用 App Startup 优化项目和使用flutterboost中的问题解决
  • Java---权限修饰符、final、static
  • unity实时保存对象的位姿,重新运行程序时用最后保存的数据给物体赋值
  • 【Java Spring】Spring MVC基础
  • MES系统的功能清单
  • docker 安装elasticsearch集群
  • Spring Boot 3 + Spring Security 6 最新版本修改 Json 登录后 RememberMe 功能问题失效的解决方案
  • Java核心知识点整理大全21-笔记
  • Redis深入理解-主从架构下内核数据结构、主从同步以及主节点选举