最近在用stm32连接imu接收数据,用一个串口连接imu接收imu发送的数据,再用另一个串口连接串口调试助手,将imu发送的数据打印到电脑上,但是发现了一个奇怪现象,就是当我的imu输入频率高时,串口助手会在极短的时间内接收一段数据,然后停止接收,并且没按一次复位键就会重复一次该现象,而且每次接收到的数据长短还不一样,而后降低imu的输入频率后,尽管情况有所好转,但在过一段时间后依然会发生这样的现象,而且不管imu频率如何都会发送这种现象。
为此,我还同imu的客服进行讨论,客服提醒我可能是串口中断出了问题。(不得不说,辰翼imu家的客服服务水平和态度都相当高),因为我用的是robomaster a型开发板,参考的是c版的串口例程,其串口的接收中断代码如下:
void UART7_IRQHandler(void)
{
volatile uint8_t receive;
//receive interrupt 接收中断
if(huart7.Instance->SR & UART_FLAG_RXNE)
{
receive = huart7.Instance->DR;
HAL_GPIO_TogglePin(Red_GPIO_Port, Red_Pin);
Cmd_GetPkt7(receive);
}
//idle interrupt 空闲中断
else if(huart7.Instance->SR & UART_FLAG_IDLE)
{
receive = huart7.Instance->DR;
HAL_GPIO_WritePin(Red_GPIO_Port, Red_Pin, GPIO_PIN_RESET);
}
}
后来上网查询相关资料,将上述代码删去,改成在HAL_UART_RxCpltCallback回调函数处理就能成功解决问题了,代码如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == UART7) {
// 处理接收到的数据
volatile uint8_t receive;
//receive interrupt 接收中断
receive = huart7.Instance->DR;
HAL_GPIO_TogglePin(Red_GPIO_Port, Red_Pin);
Cmd_GetPkt7(receive);
HAL_UART_Receive_IT(huart, &rx_byte7, 1);
}
}
我后来发现其实问题的关键可能不在是否放在回调函数上,而是因为原来的串口中断函数中,我并没有加入 HAL_UART_Receive_IT(huart, &rx_byte7, 1)才导致的原因。