• HAL_UART_Receive不能正常超时返回


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Q134488 2024-04-01 16:02 采纳率: 0% 浏览 10 首页/ 编程语言 / HAL_UART_Receive不能正常超时返回 c语言arm开发 HAL_UART_Receive_IT(&huart1, rxBuffer, 1);HAL_UART_Receive(&huart1,rec,Size, 50);同时调用这两条语句后,HAL_UART_Receive就不能正常超时了,会一直等待接收数据。uart初始化是cubemx生成的,在HAL_UART_Receive_IT调用之前的HAL_UART_Receive可以正常超时。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 码农阿豪 Java领域优质创作者 2024-04-01 16:03
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      问题描述: 调用HAL_UART_Receive_IT和HAL_UART_Receive两条语句后,HAL_UART_Receive无法正常超时且一直等待接收数据,但在调用HAL_UART_Receive_IT之前的HAL_UART_Receive可以正常超时。 回答: 根据问题描述,可以推测在调用HAL_UART_Receive_IT之后,HAL_UART_Receive_IT会不断地等待接收数据并将其处理,导致HAL_UART_Receive无法正常超时。解决此问题需要在两个函数之间进行线程同步控制和数据处理逻辑的优化。 以线程同步控制为例,可以使用信号量或互斥锁控制两个函数之间的并发调用。在HAL_UART_Receive_IT内部完成数据接收的任务后,发送信号量或解除互斥锁,使得HAL_UART_Receive可以执行数据处理逻辑并正常超时。 示例代码如下: // 定义互斥锁 osMutexDef(myMutex); osMutexId myMutexId; // 定义信号量 osSemaphoreDef(mySemaphore); osSemaphoreId mySemaphoreId; // 在main函数中 int main(void) { // 初始化myMutexId和mySemaphoreId // 在HAL_UART_Receive_IT和HAL_UART_Receive之间添加互斥锁控制 osMutexWait(myMutexId, osWaitForever); HAL_UART_Receive_IT(&huart1, rxBuffer, 1); osMutexRelease(myMutexId); // 在HAL_UART_Receive_IT中添加信号量处理 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
      osSemaphoreRelease(mySemaphoreId); // 发送信号量
      

      } // 在HAL_UART_Receive中添加信号量等待和数据处理逻辑 HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) { if (osSemaphoreWait(mySemaphoreId, Timeout) == osOK) { // 接收到数据后的逻辑处理 return HAL_OK; } else { // 超时后的逻辑处理 return HAL_TIMEOUT; } } } 需要注意的是,在使用线程同步控制时,应该避免死锁的情况发生,并合理设置等待的时间。同时,还需要优化数据处理逻辑,使得处理过程更加高效和安全。 参考资料: 1. RT-Thread操作系统实现通讯数据接收处理的同步方法。(https://www.eet-china.com/mp/a51495.html) 2. FreeRTOS使用信号量实现任务同步。 (https://www.jianshu.com/p/816c07dfc809)

      评论
    • GISer Liu 2024-04-01 16:05
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      根据你的描述,问题可能出在同时调用 HAL_UART_Receive_ITHAL_UART_Receive
      时发生了冲突,导致 HAL_UART_Receive 不能正常超时返回。一种可能的解决方案是在调用 HAL_UART_Receive_IT 后,等待接收完成的回调函数中再调用 HAL_UART_Receive
      进行接收,而不是在主循环中同时调用这两个函数。
      具体的做法如下:

      1. 确保 HAL_UART_Receive_IT 的调用是在 HAL_UART_Init 后面的,确保串口初始化完毕后才调用中断接收函数。
      2. 在接收完成的回调函数中(一般是 HAL_UART_RxCpltCallback),再调用 HAL_UART_Receive 进行下一次接收,确保串口一直处于接收状态。
        这样,串口会一直在中断接收和普通接收之间切换,保证了接收的连续性,也能够正常超时返回。
        以下是一个简单的示例代码:
        cCopy code
        // 在main.c中的全局变量定义
        uint8_t rxBuffer[1];
        uint8_t rec[Size];
        // 在main函数中调用HAL_UART_Receive_IT开始接收
        HAL_UART_Receive_IT(&huart1, rxBuffer, 1);
        // 在回调函数HAL_UART_RxCpltCallback中调用HAL_UART_Receive进行连续接收
        void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
        {
        HAL_UART_Receive(&huart1, rec, Size, 50);
        }
        
        请根据你的实际情况调整代码中的细节,确保适配你的工程。

      如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

      用户答题指南

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Flink SQL - 1.Table API && Sql 入门 Demo
    [Mybatis-Plus笔记] MybatisPlus-05-id生成策略,多数据操作,逻辑删除
    MYSQL的主从复制
    2023年开发语言和数据库排行
    Threejs入门教程
    黑马程序员 学成在线项目 第1章 项目介绍&环境搭建v3.1
    【Elastic】ElasticView 一款用来监控elasticsearch web可视化工具
    【2023年11月第四版教材】第14章《沟通管理》(第二部分)
    Spring Boot 实现参数校验基本使用
    6月适配进展|优炫数据库与40余款产品完成兼容认证
  • 原文地址:https://ask.csdn.net/questions/8082287