[HAL_UART_TRANSMIT_DMA在到达RX回调后未发送

问题描述 投票:0回答:1

我在使用圆形DMA进行接收并使用普通模式进行TX接收后,很难使UART发送数据。

在main(void)

HAL_UART_Receive_DMA(&huart2,rx_buff,INCOMING_SETTING_STRING_SIZE);
HAL_UART_Transmit_DMA(&huart2, tx_buff, OUTGOING_SETTING_SIZE);

UART设置

static void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
}

RX回叫

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    ProcessSerialSettings();

    HAL_UART_Transmit_DMA(&huart2,(uint8_t *)'ACK\n',5);

    memset(rx_buff,0,sizeof(rx_buff));
}

我确定我一定会丢失一些东西,因为它似乎太简单了。毫无疑问,每次“ processSerialSettings”函数都会更新一些变量时,数据仍继续进入设备。我想接收一个设置字符串,更新几个变量并返回一个确认。

经过进一步调试后,我现在知道端口的状态正忙,但是当我没有通过TX线路发送任何消息时,怎么办?如果我将TX DMA模式更改为循环模式,则它基本上会向串行端口发送垃圾邮件,直到我的终端窗口崩溃为止。

谢谢!

stm32 uart hal
1个回答
0
投票

通过一起删除发送DMA并使用发送来解决:

HAL_UART_Transmit(&huart2,(uint8_t *)'ACK \ n',5);

© www.soinside.com 2019 - 2024. All rights reserved.