HAL_UART_TRANSMIT_DMA не отправляется после достижения обратного вызова RX - PullRequest
0 голосов
/ 30 января 2020

Я изо всех сил пытаюсь получить данные отправки UART после получения, используя круговой DMA для RX и нормальный режим для TX.

в основном (пусто)

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 Callback

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 на циркулярный, он в основном спамит последовательным портом до тех пор, пока не откроется окно моего терминала.

Спасибо!

1 Ответ

0 голосов
/ 31 января 2020

Решил это, удалив передающий DMA все вместе и передав, используя:

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

...