单片机开发常见问题集合

文章目录

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

场景: 在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); /* 等待 发送移位寄存器 将数据帧的最后一个字节的最后一位发送出去,整个数据帧发送完毕 */
}
相关推荐
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11015 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
三佛科技-187366133975 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315205 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang5 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
2501_918126915 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315205 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘5 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动
小刘爱玩单片机5 天前
【stm32简单外设篇】- 测速传感器模块(光电)
c语言·stm32·单片机·嵌入式硬件
hateregiste5 天前
嵌入式软件开发中常见知识点问答集锦!
c语言·单片机·嵌入式软件