单片机开发常见问题集合

文章目录

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

场景: 在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); /* 等待 发送移位寄存器 将数据帧的最后一个字节的最后一位发送出去,整个数据帧发送完毕 */
}
相关推荐
大爱编程♡7 小时前
GPIO-I2C
stm32·单片机·嵌入式硬件
振南的单片机世界9 小时前
PVD掉电中断——让单片机“咽气前”写完遗书
arm开发·stm32·单片机·嵌入式硬件
续写烂尾11 小时前
SD NAND存储实测:正点原子STM32精英板SDIO读写验证全流程
stm32·单片机·嵌入式硬件
wuyk55514 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
Crkylin14 小时前
Cortex-M SysTick系统滴答定时器详解
单片机·嵌入式硬件
gscsded16 小时前
AUTOSAR CanTp 模块学习笔记
单片机·嵌入式硬件·汽车
Hello_Damon_Nikola16 小时前
扰流筋从原理到应用
人工智能·单片机·嵌入式硬件
hongmai66688817 小时前
ESP32-WROVER-B-N8R8:8MB PSRAM加持的经典双核模组,现在还值得选吗?
单片机·嵌入式硬件·物联网·智能路由器·risc-v
0x3F(小茶)18 小时前
复位异常(Cortex-M处理器)
单片机·mcu
SilicoCode18 小时前
STM32入门教程:BKP备份寄存器 & RTC实时时钟详解
stm32·单片机·嵌入式硬件