单片机开发常见问题集合

文章目录

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

场景: 在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); /* 等待 发送移位寄存器 将数据帧的最后一个字节的最后一位发送出去,整个数据帧发送完毕 */
}
相关推荐
起个网名真难~10 小时前
STM32F103_Bootloader_从零到UART升级成功_博客原稿
stm32·单片机·嵌入式硬件
二本咕咕-机械转码11 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
Zwawa12 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·单片机·嵌入式
小李不想当小白13 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
铅笔小新z18 小时前
【stm32】WWDG(窗口看门狗)
stm32·单片机·嵌入式硬件
comyccccc19 小时前
平衡车底板设计:精准布局与高效布线学习笔记
单片机·嵌入式硬件
芯片人00720 小时前
GEK100系列芯片进入上市公司上海移远通信供应链
人工智能·单片机·嵌入式硬件·物联网·芯片
fly_sunnn21 小时前
ADC模数转换器
单片机·嵌入式硬件
我叫洋洋21 小时前
I2C 为什么必须用开漏输出?从推挽短路、线与,到上拉电阻取值
单片机·嵌入式硬件
无敌贵点大王21 小时前
从寄存器层面重学STM32(5)——串口USART理论部分
stm32·单片机·嵌入式硬件