sos博 发表于 2019-7-13 21:34
哦,我学你那个,然后把flag=1放到HAL_UART_RxCpltCallbacki里面了,我DMA_RX_BUFFER_SIZE也学习你的先写 ...
如果不是必须,建议不使用DMA方式,中断方式的很清晰。
在DMA里面的中断处理的这一句:
temp= hdma_usart1_rx.Instance->CNDTR;
rx_len1 =BUFFER_SIZE - temp;
应该在这里搞定 rx_flag=1。
while loop 前一句启动 HAL_UART_Receive_DMA(&huart2,ringBuf.pBuf,ringBuf.bufSize);
while loop 中:retval = ringBufPop(&userBuf,50-userPrt,&ringBuf,&hdma_usart2_rx);
if(retval)//收到数据 get responde
{
userPrt+=retval;
uart2PrevTick = HAL_GetTick();
if(userPrt > 10 ) // data respond data 1/3 buffer ,print it
{
HAL_UART_Transmit(&hlpuart1,userBuf,userPrt,10);
while(userPrt !=0) //clean buffer
{
userBuf = 0;
userPrt--;
}
}
}
else //idle 没收到DMA
{
if (0!= userPrt)
{
if((HAL_GetTick()-uart2PrevTick) >= 10) // 间隔时间大于 10ms【对9600 波特率】,那就是单条命令接收 已完成
{
HAL_UART_Transmit(&hlpuart1,userBuf,userPrt,10); //print receive data by hlpuart1
ParseData();// 解析数据
while(userPrt !=0) //clean buffer
{
userBuf = 0;
userPrt--;
}
}
}
}
页:
1
[2]