使用 CubeMx 通过 USART 传输多个字符串
multiple string transmit over USART using CubeMx
我正在尝试 USART
使用 STM32F407VGT6
和 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
。
我不知道为什么会这样。以及如何解决?
有什么建议吗?
您需要等待发送结束的回调。它是异步执行的中断函数。它甚至没有机会发送一个字节。
您只需覆盖缓冲区并重新开始传输。
对于此类消息,请使用拦截功能。当您的主程序在通信期间正在做某事并且您希望在后台完成通信时,请使用 DMA 或中断。
编辑
一些解释。
HAL 中断函数不会等到传输完成。他们return立即给调用者,通信在后台完成。主程序可以并行执行其他任务。
当所有字节都已发送(或出错)时,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);
...
if(HAL_UART_Transmit(&huart2, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000)!= HAL_OK)
{
Error_Handler();
}
在没有回调中断的情况下使用此 HAL 函数。
我创建帐户只是为了感谢 P__J__。
我很难连续发送多个 HAL_UART_Transmit_IT,如下所示。
HAL_UART_Transmit_IT(&huart1,(uint8_t*) Test_Buffer1, length1);
HAL_Delay (1000);
HAL_UART_Transmit_IT(&huart1,(uint8_t*) Test_Buffer2, length2);
P__J__ 上面的解决方案通过使用 HAL_UART_TxCpltCallback 等待之前传输的结束完美地工作。
我正在尝试 USART
使用 STM32F407VGT6
和 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
。
我不知道为什么会这样。以及如何解决?
有什么建议吗?
您需要等待发送结束的回调。它是异步执行的中断函数。它甚至没有机会发送一个字节。
您只需覆盖缓冲区并重新开始传输。
对于此类消息,请使用拦截功能。当您的主程序在通信期间正在做某事并且您希望在后台完成通信时,请使用 DMA 或中断。
编辑
一些解释。
HAL 中断函数不会等到传输完成。他们return立即给调用者,通信在后台完成。主程序可以并行执行其他任务。
当所有字节都已发送(或出错)时,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);
...
if(HAL_UART_Transmit(&huart2, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000)!= HAL_OK)
{
Error_Handler();
}
在没有回调中断的情况下使用此 HAL 函数。
我创建帐户只是为了感谢 P__J__。
我很难连续发送多个 HAL_UART_Transmit_IT,如下所示。
HAL_UART_Transmit_IT(&huart1,(uint8_t*) Test_Buffer1, length1); HAL_Delay (1000); HAL_UART_Transmit_IT(&huart1,(uint8_t*) Test_Buffer2, length2);
P__J__ 上面的解决方案通过使用 HAL_UART_TxCpltCallback 等待之前传输的结束完美地工作。