hzp2022 2024-04-11 09:53 采纳率: 46.2%
浏览 13

STM32中断发送的一个问题

32 中断发送的一个问题,这是我写的一个中断接收,HAL_UART_Transmit(&huart3,rx_buffer3,data_length,0x200);我用来把我接收到的数据打印到串口上的, 使用HAL_UART_Transmit(&huart3,rx_buffer3,data_length,0x200)是没有问题的,串口助手上打印了我发过去的数据,但是我把函数改成了 HAL_UART_Transmit_IT(&huart3,rx_buffer3,data_length);串口助手就不打印我发过去的数据了,这是为什么呢?

void UART3_IDLECallBcak(UART_HandleTypeDef *huart)
{
    if(huart == &huart3)
    {
        HAL_UART_DMAStop(&huart3);
        __HAL_UART_CLEAR_IDLEFLAG(&huart3);
        uint8_t data_length  = BUFFER_SIZE_3 - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);
    printf("Receive Data(length = %d): ",data_length);
    HAL_UART_Transmit(&huart3,rx_buffer3,data_length,0x200);
//    printf("\r\n");
    memcpy(rc_buffer, rx_buffer3, data_length);
    memset(rx_buffer3,0,data_length);
    data_length = 0;
    HAL_UART_Receive_DMA(&huart3, (uint8_t*)rx_buffer3, BUFFER_SIZE_3);
    
    }
}
    

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-11 09:53
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的代码来看,您正在尝试在STM32上使用中断传输功能(HAL_UART_Transmit_IT())来发送数据,但是遇到的问题是数据没有显示在串口助手中。这可能是由于中断处理程序中的同步问题导致的。

    当您使用HAL_UART_Transmit_IT()时,数据会异步地通过DMA(Direct Memory Access)传输,这意味着数据的发送不会阻塞您的主循环。然而,串口助手可能需要时间来读取和显示这些数据,特别是当数据量较大或者串口波特率较低时。

    为了解决这个问题,您可以考虑以下几个步骤:

    1. 确保您的中断回调函数UART3_IDLECallBcak()正确执行且被调用。
    2. 检查您的串口助手设置,确保波特率、停止位、校验位等与您的STM32配置匹配。
    3. 调整中断触发条件,例如,可以等待一个完整的字符或多个字节被发送后再进行打印。这可以通过修改huart->Init.RxIxConfig属性实现,将其设置为UART_RxIxConfig/repositoryName/Idle,这样中断将在空闲线程发生时触发。

    这是一个示例代码,展示了如何调整中断触发条件,并添加一个小延时来确保数据已被发送出去:

    // 在初始化UART时设置中断触发条件
    huart3.Init.RxIxConfig = UART_RxIxConfig_Idle;
    
    // ...其他UART初始化参数...
    
    // 在中断回调函数中添加延时
    void UART3_IDLECallBcak(UART_HandleTypeDef *huart)
    {
        if (huart == &huart3)
        {
            // ...其他代码保持不变...
    
            // 添加一个延时,确保数据已经发送出去
            HAL_Delay(5); // 这里只是一个示例值,实际值可能需要根据具体情况进行调整
    
            // 现在可以安全地打印数据了
            printf("Receive Data(length = %d): ", data_length);
            HAL_UART_Transmit(&huart3, rx_buffer3, data_length, 0x200);
    
            // ...其他代码保持不变...
        }
    }
    
    1. 如果以上方法仍然无法解决问题,您可能需要检查中断优先级是否合适,确保中断处理程序能及时被执行。同时,确认是否有其他中断或任务抢占了这个中断的执行。

    2. 最后,如果可能的话,在您的应用中加入一些日志输出,以便跟踪数据何时被发送,以及中断何时被触发,这将有助于定位问题。

    如果您在调试过程中仍遇到困难,请提供更多的上下文信息,比如中断优先级设置、波特率配置、以及其他可能影响数据传输的因素。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月11日