whitesheeps 2024-12-05 10:23 采纳率: 25%
浏览 86
已结题

stm32f103,hal库 hal_usart_receive函数接收不到数据。

没有发送任何数据,rxData一直显示7F。串口一打开,接收端一直显示FF。usart单独设置Tx时可以正常发送并显示。接线检查没有问题。

img

img

img

  • 写回答

31条回答 默认 最新

  • 关注
    获得0.60元问题酬金

    上午好☀️☀️☀️️
    本答案参考通义千问

    根据你的描述,STM32F103使用HAL库的HAL_USART_Receive函数接收不到数据,并且在串口打开时接收端一直显示FF。这种情况可能是由多种原因引起的,包括配置问题、硬件问题或代码逻辑问题。下面是一些可能的解决方案:

    解决方案

    1. 检查USART配置

      • 确保USART的波特率、数据位、停止位和校验位与发送端一致。
      • 检查USART的时钟是否已经使能。
    2. 检查GPIO配置

      • 确保USART的TX和RX引脚已经正确配置为复用功能。
      • 确保没有其他外设占用这些引脚。
    3. 检查中断配置

      • 如果你使用了中断接收,确保中断已经正确配置并使能。
      • 检查中断优先级设置,确保不会被其他中断抢占。
    4. 检查接收缓冲区

      • 确保接收缓冲区没有溢出。
      • 检查接收缓冲区的大小是否足够。
    5. 检查代码逻辑

      • 确保在调用HAL_USART_Receive之前,USART已经初始化成功。
      • 确保在接收完成后,正确处理接收的数据。

    代码示例

    以下是一个简单的示例代码,展示了如何使用HAL库配置USART并接收数据:

    #include "stm32f1xx_hal.h"
    
    UART_HandleTypeDef huart1;
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_USART1_UART_Init(void);
    
    int main(void)
    {
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        MX_USART1_UART_Init();
    
        uint8_t rxData;
        uint8_t sendData = 'A';
    
        // 发送数据
        if (HAL_OK == HAL_UART_Transmit(&huart1, &sendData, 1, 100))
        {
            // 接收数据
            if (HAL_OK == HAL_UART_Receive(&huart1, &rxData, 1, 100))
            {
                // 处理接收到的数据
                // 例如:将接收到的数据通过OLED显示
                // OLED_ShowHexNum(3, 1, rxData, 2);
            }
        }
    
        while (1)
        {
            // 主循环
        }
    }
    
    void SystemClock_Config(void)
    {
        // 配置系统时钟
        // ...
    }
    
    static void MX_GPIO_Init(void)
    {
        // 初始化GPIO
        // ...
    }
    
    static void MX_USART1_UART_Init(void)
    {
        huart1.Instance = USART1;
        huart1.Init.BaudRate = 115200;
        huart1.Init.WordLength = UART_WORDLENGTH_8B;
        huart1.Init.StopBits = UART_STOPBITS_1;
        huart1.Init.Parity = UART_PARITY_NONE;
        huart1.Init.Mode = UART_MODE_TX_RX;
        huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart1.Init.OverSampling = UART_OVERSAMPLING_16;
        if (HAL_UART_Init(&huart1) != HAL_OK)
        {
            // 初始化错误处理
            Error_Handler();
        }
    }
    
    void Error_Handler(void)
    {
        // 错误处理
        while (1)
        {
        }
    }
    

    重点检查项

    1. USART配置

      • 波特率、数据位、停止位和校验位是否与发送端一致。
      • USART时钟是否已经使能。
    2. GPIO配置

      • TX和RX引脚是否已经正确配置为复用功能。
      • 是否有其他外设占用这些引脚。
    3. 中断配置(如果使用中断):

      • 中断是否已经正确配置并使能。
      • 中断优先级设置是否合理。
    4. 接收缓冲区

      • 接收缓冲区是否溢出。
      • 接收缓冲区的大小是否足够。
    5. 代码逻辑

      • 在调用HAL_USART_Receive之前,USART是否已经初始化成功。
      • 在接收完成后,是否正确处理接收的数据。

    通过以上步骤,你应该能够找到并解决接收不到数据的问题。如果问题仍然存在,请提供更多的代码细节以便进一步分析。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月13日
  • 创建了问题 12月5日