Interrupt STM32 HAL_UART_传输_它永远不会返回

Interrupt STM32 HAL_UART_传输_它永远不会返回,interrupt,stm32,uart,st,Interrupt,Stm32,Uart,St,我已经创建了一个使用cube mx的项目,希望使用uart4 tx和rx在中断模式下发送和接收字节 我有: uint8\u t buffer[]=测试\r\n; ifHAL_UART_IT和huart4、uint8_t*缓冲区、STRLENBUFER!=好的 { } uart初始化为 静态无效MX_UART4_Initvoid { huart4.Instance=UART4; huart4.Init.BaudRate=9600; huart4.Init.WordLength=UART_WordL

我已经创建了一个使用cube mx的项目,希望使用uart4 tx和rx在中断模式下发送和接收字节

我有:

uint8\u t buffer[]=测试\r\n; ifHAL_UART_IT和huart4、uint8_t*缓冲区、STRLENBUFER!=好的 { } uart初始化为

静态无效MX_UART4_Initvoid { huart4.Instance=UART4; huart4.Init.BaudRate=9600; huart4.Init.WordLength=UART_WordLength_8B; huart4.Init.StopBits=UART\u StopBits\u 1; huart4.Init.Parity=UART\u Parity\u NONE; huart4.Init.Mode=UART\u Mode\u TX\u RX; huart4.Init.HwFlowCtl=UART\u HWCONTROL\u NONE; huart4.Init.OverSampling=UART\u OverSampling\u 16; huart4.Init.OneBitSampling=UART\u一位\u采样\u禁用; huart4.AdvancedInit.AdvFeatureInit=UART\u ADVFEATURE\u NO\u INIT; 如果HAL_UART_Init&huart4!=HAL_OK { _错误\u处理程序\u文件\u,\u行\u; } } 对传输的呼叫从未返回,只是停留在那里

在msp文件中,我有

HAL_NVIC_SetPriorityUART4_IRQn,0,0; HAL_NVIC_EnableIRQUART4_IRQn; 并将其保存在it文件中

无效UART4_IRQHandlervoid { /*用户代码开始UART4\u IRQn 0*/ /*用户代码结束UART4_IRQn 0*/ HAL_UART_IRQHandler&huart4; /*用户代码开始UART4_IRQn 1*/ /*用户代码结束UART4_IRQn 1*/ }
我遗漏了什么?

添加延迟也允许发送数据修复了此问题。HAL_Delay100

该问题与uint8_t buffer[]=test\r\n; 右边是char,左边是uint8。因此,您必须执行以下操作

char buffer[] = "test\r\n";
if(HAL_UART_Transmit_IT(&huart4, (char*)buffer, strlen(buffer))!= HAL_OK)
{

}
或者您可以使用sizeof for int8\t而不是strlen来完成此操作

unit8_t buffer[] = "test\r\n";
if(HAL_UART_Transmit_IT(&huart4, (uint8_t*)buffer, sizeof(buffer))!= HAL_OK)
{

}

请添加string.h,在代码的第一行

我注意到的另一件事是,如果我单步执行传输函数,它将到达末尾,并将返回HAL_OK,我在控制台窗口中看到:信息:暂停:PC:0x08002358,当我跨过return语句时,它会被打印很多次。即使它返回OK,它的函数也不意味着它已经完成了发送。uint8\u t buffer[]是全局变量吗?您是否实现了void HAL_UART_TxCpltCallbackUART_HandleTypeDef*huart函数?添加延迟也允许发送数据修复了此问题。哈卢100;如果使用DMA或中断传输,则使用延迟是没有意义的。这个想法是:传输要在后台完成。如果添加延迟,则最好改为轮询。延迟也意味着严重的算法问题——这是一种非常糟糕的编程习惯。