2

我正在尝试USART使用STM32F407VGT6 and CubeMX

我能够使用中断发送和接收数据。但是我遇到了一个我无法理解的问题:

HAL_UART_Transmit_IT用来发送数据。
我已启用__HAL_UART_ENABLE_IT(&huart3,UART_IT_TC);.

这是我的代码:

int main(void)
{
  HAL_Init();
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  Green_Blink(100);
  Orange_Blink(100);
  Blue_Blink(100);
  Red_Blink(100);
  HAL_Delay(100);

  __HAL_UART_ENABLE_IT(&huart3,UART_IT_TC);
  char buff[] = {'2','4','.','0','0'};
  while (1)
  {
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)"OK\r\n ",5);
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)buff,5);
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)"OK\r\n ",5);
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)buff,5);
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)"OK\r\n ",5);
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)buff,5);
        HAL_Delay(1000);
        Blue_Blink(100);

  }
}

所以我正在发送这种数据。首先,我正在发送OK,然后我正在发送缓冲区数据,如您所见。

但是在终端(在我的情况下是tera term)我看不到缓冲区数据。
我可以看到OK

我不知道为什么会这样。以及如何解决?
有什么建议么?

4

3 回答 3

3

需要等待回调,表示传输结束。它是异步执行的中断函数。它甚至没有机会发送一个字节。

您只需覆盖缓冲区并重新开始传输。

对于此类消息,请使用阻止功能。当您的主程序在通信期间执行某些操作并且您希望在后台完成通信时,请使用 DMA 或中断。

编辑

一些解释。HAL 中断函数不会等到传输完成。他们立即返回给调用者,并在后台完成通信。主程序可以并行执行其他任务。当所有字节都发送(或发生错误)时,HAL 库调用适当的回调。对于传输结束,它是:void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

由于异步执行,如果您想开始另一个传输,您需要知道前一个传输是否已经完成。

编辑 2

在这种情况下,异步发送没有任何意义。您需要等待之前的传输结束:

volatile int USART3TransferCompleted;

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    USART3TransferCompleted = 1; // this functions should check the instance as well
}

在主要功能中:

        USART3TransferCompleted = 0;
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)"OK\r\n ",5);
        while(!USART3TransferCompleted);
        USART3TransferCompleted = 0;
        HAL_UART_Transmit_IT(&huart3,(uint8_t*)buff,5);
        while(!USART3TransferCompleted);
        ...
于 2018-08-15T21:08:44.920 回答
0
if(HAL_UART_Transmit(&huart2, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000)!= HAL_OK)
    {
      Error_Handler();
    }

在没有回调中断的情况下使用这个 HAL 函数。

于 2019-10-31T09:08:00.670 回答
0

我创建帐户只是为了感谢 P__J__。

我努力连续发送多个 HAL_UART_Transmit_IT 如下。

HAL_UART_Transmit_IT(&huart1,(uint8_t*) Test_Buffer1, length1); HAL_延迟(1000);HAL_UART_Transmit_IT(&huart1,(uint8_t*) Test_Buffer2, length2);

上面的 P__J__ 解决方案通过使用 HAL_UART_TxCpltCallback 等待先前传输的结束完美运行。

于 2020-10-16T14:10:25.357 回答