单片机开发常见问题集合

文章目录

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

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

c 复制代码
/*********************************************************************
 * @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);	
#endif
  return data;
}

解决:

  • 方案1:修改fputc内部实现
c 复制代码
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);	
#endif
  return data;
}
  • 方案2:业务中不使用printf函数,使用自行实现接口
c 复制代码
/**
 * @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); /* 等待 发送移位寄存器 将数据帧的最后一个字节的最后一位发送出去,整个数据帧发送完毕 */
}
相关推荐
v先v关v住v获v取3 小时前
番茄收获机切割与分离装置结构设计cad5张 +三维图+设计说明书
科技·单片机·51单片机
￴ㅤ￴￴ㅤ9527超级帅4 小时前
4、stm32异常与中断
stm32·单片机·嵌入式硬件
BreezeJuvenile5 小时前
通用定时器_测量PWM方波的周期和占空比案例
stm32·单片机·学习·通用定时器·pwm输入·测量占空比
进阶的猪5 小时前
stm32f407 RCC时钟配置
stm32·单片机·嵌入式硬件
ArrebolJiuZhou6 小时前
02arm指令集(一)——LDR,MOV,STR的使用
linux·网络·单片机
小刘爱玩单片机7 小时前
【stm32简单外设篇】- 三色LED
c语言·stm32·单片机·嵌入式硬件
d111111111d7 小时前
STM32平衡车测试,定时中断读取速度
笔记·stm32·单片机·嵌入式硬件·学习·模块测试
电子工程师-C5110 小时前
基于51单片机的交通灯远程控制系统
单片机·嵌入式硬件·51单片机
国科安芯10 小时前
低轨卫星边缘计算节点的抗辐照MCU选型分析
人工智能·单片机·嵌入式硬件·架构·边缘计算·安全威胁分析·安全性测试
youcans_10 小时前
【STM32-MBD】(9)Simulink 模型开发之上位机显示波形
stm32·单片机·嵌入式硬件·上位机·simulink