使用CubeMx通过USART进行多字符串传输

使用CubeMx通过USART进行多字符串传输,c,interrupt,stm32,uart,stm32-hal,C,Interrupt,Stm32,Uart,Stm32 Hal,我正在尝试使用和CubeMX的USART 我能够使用中断发送和接收数据。但我遇到了一个我无法理解的问题: 我正在使用HAL\u UART\u Transmit\u IT发送数据。 我已经启用了\uuuuHAl\uUART\uEnable\uIT(&uART3,UART\uIT\uTC) 这是我的密码: int main(void) { HAL_Init(); MX_GPIO_Init(); MX_USART3_UART_Init(); Green_Blink(100); Or

我正在尝试使用和
CubeMX
USART

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

我正在使用
HAL\u UART\u Transmit\u IT
发送数据。
我已经启用了
\uuuuHAl\uUART\uEnable\uIT(&uART3,UART\uIT\uTC)

这是我的密码:

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
,然后发送缓冲区数据,如您所见

但在终端(我的情况是Terra术语)中,我看不到缓冲区数据。
我可以看到
OK

我不知道为什么会这样。如何解决这个问题?

有什么建议吗?

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

您只需覆盖缓冲区并启动传输

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

编辑 一些解释。 HAL中断功能不等待传输完成。他们会立即将返回给呼叫者,并在后台完成通信。主程序可以并行执行其他任务。 当发送所有字节时(或出错时),HAL库调用相应的回调。对于传输结束,它是:
void HAL\u UART\u TxCpltCallback(UART\u 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);
        ...

使用此HAL函数时不需要回调中断。

我创建我的帐户只是为了向p_uuj_uu表示感谢

我努力发送多个HAL_UART_发送它,如下所示

HAL\u UART\u传输\u IT(&huart1,(uint8\u t*)测试\u缓冲区1,长度1); HAL_延迟(1000); HAL_UART_传输_IT(&huart1,(uint8_t*)测试_缓冲区2,长度2)


p_uuj_uu以上的解决方案是使用HAL_UART_TXCPLTCALLLBACK等待前一次传输的结束,效果非常好。

我没有真正理解您的意思。我使用中断进行传输,什么是回调?如何实现它?什么是阻塞函数?如果我在使用中断,那么我的交流不是在后台进行的吗?@EhsanHabib一般的规则是:如果你不理解,就不要使用它。告诉我为什么要打断?你想存档什么?@EhsanHabib使用普通的阻塞功能。不是它或DMA,你会得到你想要的want@EhsanHabib想象一下,你是一个干燥剂。你的老板(主程序)告诉你去机场接某人。当你启动引擎时,同一个老板打电话给你,告诉你去仓库送东西。又过了一分钟,他说你去学校接他的孩子,又过了一分钟,他去商店给他买烟。当你带着香烟时,你被解雇了,因为你没有去机场,你没有送货,你没有去接他的孩子。只是因为他没有等到你完成特定的任务,所以我明白了。因此,在发送另一个字符串之前,我需要等待最后一个字符串完全发送。当(HAL_UART_Transmit_IT(&huart3,(uint8_t*)buff,6)=HAL_BUSY)等待时,我应该像这样等待吗或是否有任何标志我应该等待?请使用评论来感谢他人或询问更多详细信息:)我还创建了一个帐户来感谢0,上面的解决方案是使用HAL_UART_TxCpltCallback(如“编辑2”中所述)来等待前一次传输的结束。
if(HAL_UART_Transmit(&huart2, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000)!= HAL_OK)
    {
      Error_Handler();
    }