问题原因
在连续用HAL_UART_Transmit_DMA()函数的时候,会遇到只能发出第一条的问题,原因是DMA传输数据到串口这个外设太快了,传输完后程序并不会在该处停留,但是串口发送需要时间,运行到下一条HAL_UART_Transmit_DMA()函数的时候,上一条数据还没来得及发完,导致串处于BUZY(即 HAL_UART_STATE_BUSY )状态
如果串口处于BUZY状态,则HAL_UART_Transmit_DMA()不会进入发送程序,直接return HAL_BUSY;这就导致了HAL_UART_Transmit_DMA()不能连续运行,
目前网上主流的解决办法是延时一定时间或while(HAL_DMA_GetState(&hdma_usart1_tx) == HAL_DMA_STATE_BUZY),等串口发完数据在执行下一条指令。但是这样让CPU卡在这里,让DMA和串口外设的速度优势荡然无存,并且,HAL_DMA_GetState()好像只要初始化之后它的状态就不会生变化,要采用if((&huart1)->gState == HAL_UART_STATE_READY)进行判断比较有用。
于是我采用了如下办法
解决方法
while (1)
{
if((&huart1)->gState == HAL_UART_STATE_READY)
{
if(dma_uartThread == 4)
dma_uartThread=0;
dma_state=1;
dma_uartThread++;
}
if(dma_state)
{
switch(dma_uartThread)
{
case 1:
HAL_UART_Transmit_DMA(&huart1,dma_sentTest1,sizeof(dma_sentTest1));
dma_state=0;
break;
case 2:
HAL_UART_Transmit_DMA(&huart1,dma_sentTest2,sizeof(dma_sentTest2));
dma_state=0;
break;
case 3:
HAL_UART_Transmit_DMA(&huart1,dma_sentTest3,sizeof(dma_sentTest3));
dma_state=0;
break;
case 4:
HAL_UART_Transmit_DMA(&huart1,dma_sentTest4,sizeof(dma_sentTest4));