首先配置定时器计数时长(串口接收时间)
本次配置为5ms(72MHz频率下 配置为PSC=72 ARR=5000)
串口和定时器均需要打开中断 可配置相同中断优先级
编写串口接收回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
__HAL_TIM_SET_COUNTER(&htim3,0);
if(0 == rs485i.Rx_cnt)
{
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim3);
}
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);
rs485i.Rx_Buf[rs485i.Rx_cnt] = rs485i.Rx_temp[0];
rs485i.Rx_cnt++;
HAL_UART_Receive_IT(&huart1,rs485i.Rx_temp,REC_LENGTH);
}
编写定时器中断函数:
if (htim->Instance == TIM3) {
rs485i.Rx_flg = 1;
HAL_TIM_Base_Stop_IT(&htim3);
}
当串口接收到第一帧数据时打开定时器 计时5ms后关闭定时器 并将接受标志位置1
在主函数中判断标志位为1时需要做的事情 并将标志位清0
此方法缺点为5ms后数据起始位可能不是正确的数据帧第一位 造成接收多次才能收到正确数据帧
当发送端增加延时发送时可以解决此问题 但程序会变阻塞