我打算用串口控制EC20模块,今天调试串口的DMA发送和串口接收, 开发板通过CH340电脑相连,单独接收和发送数据没有问题,想连起来一起调试, 通过串口调试助手向开发板发送数据,通过串口中断接收到数据后,在通过串口的DMA功能发送出去, 程序一直会进入DMA的半传输完成功能中断,还会触发串口的接收中断,串口会不断的将最后收到的那个字节的数据发回电脑: 例如:发送"ABC" 开发板 会一直回复 “ABCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC.......” |
void USART3_IRQHandler() //串口3中断接收数据
{
RxTimeout =10;
HAL_NVIC_ClearPendingIRQ(USART3_IRQn); // 清除中断标志位 解决使用DMA发送后,一直进入接收中断的问题
HAL_UART_IRQHandler(&Uart3Handle); //中断处理函数 清除中断标注位 会间接的调用接收回调函数
if (RxCount< Rx_MAXSIZE) //接收缓冲区没满 还可以接收数据
{
RxBuf[RxCount++]=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-20 zhang
{
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;
}