OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3222|回复: 1

如何用HAL库中断接收多帧数据

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-3-7
在线时间
2 小时
发表于 2023-6-8 17:42:09 | 显示全部楼层 |阅读模式
2金钱
求救!!!!!急急急!!!
新手没有太多币,求大佬帮助!!!
最近在进行大疆payload开发,用的是rtos系统,里面代码用的是hal库相关
目前需求是我向uart4发送查询命令,然后uart4会返回8段数据,每段数据开头是有规律的多个字节,但是结尾标志是0x01,这个字节在中间也会出现多次
我需要把从uart4接收到的数据发送到uart3,经过尝试并不能完全接收,在接收端每次只接收到几段就没了(比如8段只接收了3段),下面放下我写的代码,求大佬指导

初始化:
void uart_init(u32 bound)
{       
        UART4_Handler.Instance = UART4;
  UART4_Handler.Init.BaudRate = bound;
  UART4_Handler.Init.WordLength = UART_WORDLENGTH_8B;
  UART4_Handler.Init.StopBits = UART_STOPBITS_1;
  UART4_Handler.Init.Parity = UART_PARITY_NONE;
  UART4_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  UART4_Handler.Init.Mode = UART_MODE_TX_RX;
  UART4_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
  HAL_UART_Init(&UART4_Handler);
  __HAL_UART_ENABLE_IT(&UART4_Handler, UART_IT_RXNE);
        __HAL_UART_ENABLE_IT(&UART4_Handler, UART_IT_IDLE);

  //HAL_UART_Receive_IT(&UART4_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);

}


        UART4_TX_GPIO_CLK_ENABLE();
        UART4_RX_GPIO_CLK_ENABLE();
        /* Enable USART clock */
        __HAL_RCC_UART4_CLK_ENABLE();

        /*##-2- Configure peripheral GPIO ##########################################*/
        /* UART TX GPIO pin configuration  */
        GPIO_InitStruct.Pin = UART4_TX_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
        GPIO_InitStruct.Alternate = UART4_TX_AF;

        HAL_GPIO_Init(UART4_TX_GPIO_PORT, &GPIO_InitStruct);

        /* UART RX GPIO pin configuration  */
        GPIO_InitStruct.Pin = UART4_RX_PIN;
        GPIO_InitStruct.Alternate = UART4_RX_AF;

        HAL_GPIO_Init(UART4_RX_GPIO_PORT, &GPIO_InitStruct);

        /*##-3- Configure the NVIC for UART ########################################*/
        /* NVIC for UART4 */
        HAL_NVIC_SetPriority(UART4_IRQn, UART4_IRQ_PRIO_PRE, UART4_IRQ_PRIO_SUB);
        HAL_NVIC_EnableIRQ(UART4_IRQn);


中断函数:
void UART4_IRQHandler(void)                       
{
        if((__HAL_UART_GET_FLAG(&UART4_Handler,UART_FLAG_RXNE)!=RESET))
        {
                if(USART_RX_OK==0)
                {
                        USART_RX_BUF[USART_RX_STA] = UART4_Handler.Instance->DR;
                        USART_RX_STA++;
                        __HAL_UART_CLEAR_FLAG(&UART4_Handler,UART_FLAG_RXNE);
                       
                }

        }
        else if(__HAL_UART_GET_FLAG(&UART4_Handler,UART_FLAG_IDLE)!=RESET)
        {
                __HAL_UART_CLEAR_IDLEFLAG(&UART4_Handler);
                USART_RX_OK=1;
               
        }

                HAL_UART_IRQHandler(&UART4_Handler);

}


任务里循环判断发送:
void uart4_Task(void const *argument)
{
                T_DjiReturnCode djiStat;
                E_DjiChannelAddress channelAddress;
        while(1)
    {
                        if(USART_RX_OK==1)
                        {
                                channelAddress = DJI_CHANNEL_ADDRESS_MASTER_RC_APP;
                                djiStat = DjiLowSpeedDataChannel_SendData(channelAddress, USART_RX_BUF, USART_RX_STA);
                                if (djiStat == DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
                                {
                                        USART_RX_STA=0;
                                        USART_RX_OK=0;
                                }
                        }
                        vTaskDelay(10);
    }
}

求救!!!!!急急急!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4724
金钱
4724
注册时间
2015-1-10
在线时间
590 小时
发表于 2023-6-12 11:03:32 | 显示全部楼层
HAL_UART_IRQHandler(&UART4_Handler);把空闲中断清除了吧,没进else if(__HAL_UART_GET_FLAG(&UART4_Handler,UART_FLAG_IDLE)!=RESET)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 11:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表