项目场景:
STM32中HAL_UART_Transmit()函数本应该实现阻塞赋值的功能,连续发送时,自动会等待上一个函数发送完成,然后进行下一个函数的发送,并不需要Delay.
问题描述
在以下代码中,不加HAL_Delay(1),此时串口发送就只能是第一个元素
else if(Command_data==0x69)
{
HAL_UART_Transmit(&huart1,(uint8_t *)text5,sizeof(text5),200000);
// HAL_Delay(1);
text2[0]=48+dir_sector_index[0]/10;
HAL_UART_Transmit(&huart1,(uint8_t *)text2,sizeof(text2),200000);
// HAL_Delay(1);
text2[0]=48+dir_sector_index[0]%10;
HAL_UART_Transmit(&huart1,(uint8_t *)text2,sizeof(text2),200000);
// HAL_Delay(1);
}
Current page
本来阻塞赋值函数多用于需要连续发送场景,但现在不能连续发送。
原因分析:
/* Check that a Tx process is not already ongoing */
if (huart->gState == HAL_UART_STATE_READY)
{
if ((pData == NULL) || (Size == 0U))
{
return HAL_ERROR;
}
/* Process Locked */
__HAL_LOCK(huart);
根据网上提示,查看是否需要等待标志位,或者上锁问题。由于sizeof在计算数组长度时需要返回值,使得_HAL_LOCK(huart);
无法正常上锁,
例如:Handler
发送消息有两种方式,分别是 Handler.obtainMessage()
和 Handler.sendMessage()
,其中 obtainMessage
方式当数据量过大时,由于 MessageQuene
大小也有限,所以当 message
处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
解决方案:
把sizeof替换成所需的数值,避免函数的嵌套。