jianxuan5527 发表于 2019-5-22 22:37:13

串口DMA发送和中断接收的问题?

我打算用串口控制EC20模块,今天调试串口的DMA发送和串口接收,
开发板通过CH340电脑相连,单独接收和发送数据没有问题,想连起来一起调试,
通过串口调试助手向开发板发送数据,通过串口中断接收到数据后,在通过串口的DMA功能发送出去,
程序一直会进入DMA的半传输完成功能中断,还会触发串口的接收中断,串口会不断的将最后收到的那个字节的数据发回电脑:
例如:发送"ABC"
开发板 会一直回复 “ABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.......”

jianxuan5527 发表于 2019-5-23 09:19:57

这块是中断的处理代码

void USART3_IRQHandler()       //串口3中断接收数据
{
        RxTimeout =10;
        HAL_NVIC_ClearPendingIRQ(USART3_IRQn);    // 清除中断标志位   解决使用DMA发送后,一直进入接收中断的问题
       
        HAL_UART_IRQHandler(&Uart3Handle);   //中断处理函数   清除中断标注位    会间接的调用接收回调函数
    if (RxCount< Rx_MAXSIZE)             //接收缓冲区没满还可以接收数据
        {
                RxBuf=RxData;         //接收的数据放在接受缓冲区中
        }
        else
        {
               USART3_RX_STA|=1<<15;                                //缓冲区已满 强制标记接收完成
               
               ReceCount=RxCount;                //记录接收到的数据个数
               RxCount=0;                         //接收数量清零
               RxTimeout=0;                     //接收超时清零
        }
        HAL_UART_Receive_IT(&Uart3Handle, (uint8_t *)(&RxData), 1);   //** 接收完成后会关闭中断所以要循环调用次函数 接收一个字节进入一次接收完成回调函数

}

void DMA1_Channel2_IRQHandler(void)
{
        HAL_DMA_IRQHandler(Uart3Handle.hdmatx);
}

在定时器里进行超时的接收完成
__weak void HAL_IncTick(void)
{
uwTick++;
       
        if (RxTimeout>0)                                                  //2019-05-20zhang
        {
                RxTimeout--;
                if(RxTimeout==0)
                {
                        USART3_RX_STA|=1<<15;                          //接收超时 标记接收完成

                        ReceCount =RxCount;            //记录接收到的数据个数
                        RxCount=0;                         //接收数量清零
                  RxTimeout=0;                     //接收超时清零
                }                       
        }                                               
}

在主函数里面判断 接收标志位,将收到的数据发送回来

          if(USART3_RX_STA&0X8000)                //接收到数据
    {
                HAL_sta=HAL_UART_Transmit_DMA(&Uart3Handle,RxBuf, ReceCount);
               
                while(TX_END !=1){} //等待放松完成
                       
                //HAL_UART_Transmit(&UartHandle,RxBuf, ReceCount,2000);
                ReceCount=0;
                USART3_RX_STA=0;
    }
页: [1]
查看完整版本: 串口DMA发送和中断接收的问题?