我正在尝试使用STM32F407VGT6
和USART
来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术语),我看不到缓冲区数据。
我可以看到OK
。
我不知道为什么会这样。以及如何解决呢?
有什么建议吗?
答案 0 :(得分:3)
您需要等待回调,这表明传输已结束。中断功能是异步执行的。它甚至没有机会发送单个字节。
您只需覆盖缓冲区并重新开始传输即可。
对于此类消息,请使用阻止功能。当您的主程序在通信过程中执行某项操作并且您希望在后台进行通信时,请使用DMA或中断程序。
一些解释。
HAL中断功能不会等到发送完成。他们立即返回给呼叫者,并且通信在后台完成。主程序可以并行执行其他任务。
发送完所有字节后(或发生错误时),HAL库将调用相应的回调。对于传输结束,它是:void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
由于要执行异步传输,因此如果要启动另一种传输,则需要知道先前的传输是否已经完成。
在这种情况下,异步发送没有任何意义。您需要等待之前的传输结束:
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);
...
答案 1 :(得分:0)
if(HAL_UART_Transmit(&huart2, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 5000)!= HAL_OK)
{
Error_Handler();
}
使用此HAL函数而不会产生回调中断。
答案 2 :(得分:0)
我创建我的帐户只是为了感谢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来完美地等待之前的传输结束,