野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23320|回复: 1

DMA串口接收到数据,不能立刻发送数据(HAL库)

[复制链接]
发表于 2020-11-19 17:25:49 | 显示全部楼层 |阅读模式
本帖最后由 尘缘里的记忆 于 2020-11-19 17:28 编辑

今天用到串口DMA+空闲中断来进行收发数据,但是在收到数据后,要延时 2ms 才能发送数据,一旦去掉延时,发送的数据就全是0xFF;
请问各位大佬,接收完后,要进行什么操作?? 才能紧接着就可以发送数据!!  谢谢啦
  1. void USART3_4_IRQHandler(void)
  2. {
  3.   if((__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) == true))
  4.         {
  5.                 /* Clear IDLE Flag */
  6.         __HAL_UART_CLEAR_IDLEFLAG(&huart3);
  7.                
  8.                 /* Stop Receive */
  9.                 HAL_UART_DMAStop(&huart3);                        //如果发生了空闲中断,则先关闭DMA,不再接受数据

  10.                 /* len */
  11.                 relayLen = 70 - huart3.hdmarx->Instance->CNDTR;

  12.                 if(relayLen == 6)
  13.                 {
  14.                   relayFlyBuf[0]=0;
  15.                   relay_Done=1;
  16.                 }
  17.                 else
  18.                 {
  19.                         RelayFly_Init();//重新开始DMA接收
  20.                         return;
  21.                 }
  22.         }
  23.   HAL_UART_IRQHandler(&huart3);
  24. }

  25. void main(void)
  26. {
  27.         while(1)
  28.         {
  29.                 if(relay_Done)
  30.                 {
  31.                         HAL_Delay(2);
  32.                         //while(HAL_DMA_GetState(&hdma_usart3_tx) != HAL_DMA_STATE_READY);
  33.                         //while(HAL_UART_GetState(&huart3) != HAL_UART_STATE_READY);
  34.                         //while(huart3.hdmarx->Instance->CNDTR!=0)
  35.                         //while(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE)!=1)

  36.                         HAL_GPIO_WritePin(WBUS2_CTL_GPIO_Port,WBUS2_CTL_Pin, GPIO_PIN_RESET);//设置发射
  37.                         HAL_UART_Transmit_DMA(&huart3, buff_temp, 31);
  38.                         while(HAL_UART_GetState(&huart3) != HAL_UART_STATE_READY);//等待发送完成
  39.                        
  40.                         HAL_GPIO_WritePin(WBUS2_CTL_GPIO_Port, WBUS2_CTL_Pin, GPIO_PIN_SET);//设置接收       
  41.                         HAL_UART_Receive_DMA(&huart3, relayFlyBuf, 70);//开始接收

  42.                         relay_Done=0;
  43.                 }
  44.         }
  45.        
  46. }
复制代码

回复

使用道具 举报

 楼主| 发表于 2020-11-20 17:28:30 | 显示全部楼层
找到原因了,我之前发射端是这样写的
HAL_GPIO_WritePin(WBUS2_CTL_GPIO_Port,WBUS2_CTL_Pin, GPIO_PIN_RESET);//设置发射使能
HAL_UART_Transmit_DMA(&huart3, buff_temp, 6);
HAL_Delay(1);
HAL_GPIO_WritePin(WBUS2_CTL_GPIO_Port,WBUS2_CTL_Pin, GPIO_PIN_SET);
后面我改成
HAL_GPIO_WritePin(WBUS2_CTL_GPIO_Port,WBUS2_CTL_Pin, GPIO_PIN_RESET);//设置发射使能
HAL_UART_Transmit_DMA(&huart3, buff_temp, 6);
while(HAL_UART_GetState(&huart3) != HAL_UART_STATE_READY);
HAL_GPIO_WritePin(WBUS2_CTL_GPIO_Port,WBUS2_CTL_Pin, GPIO_PIN_SET);  
然后接收端收到数据不用加延时也能正常发送数据。
另外发现接收端将重新设置接收放在while{ if(收到数据){设置接收} }会出现偶尔收不到数据的情况,把重新设置接收放在while中if外面,没出现这种现象
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 03:56 , Processed in 0.025548 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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