###1.CUBE-MX配置串口
2.我采用串口中断接收,打开中断接口
3.时钟同样8倍频,1分频,使用内部时钟
打开串口中断
main()
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 启用空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // 启用接收数据就绪中断
HAL_UART_Receive_IT(&huart1,RxData,1); // 启动接收
while(1)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&crc,2,HAL_MAX_DELAY);//发送函数,第一个参数串口的句柄huart1,第二个参数发送的内容crc,这个地方自己修改:HAL_MAX_DELAY这个参数表示无限等待下去,直到发送成功为止
}
}
主函数写完了,现在进行对中断函数处理,这里进行一个字符一个字符的接收
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
// 检查接收数据就绪标志
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
//从USART接收一个字节,并存储到RxData数组
RxData[temp++] = USART1->DR;
}
else if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)
{
// 检查空闲标志
uint32_t temp1;
temp1 = huart1.Instance->SR; // 读取 SR 寄存器
temp1 = huart1.Instance->DR; // 读取 DR 寄存器
Counter_RSUSART =temp;
// 重置计数器,准备接收下一帧数据
temp = 0;
}
HAL_UART_IRQHandler(&huart1);//重新打开中断
/* USER CODE END USART1_IRQn 1 */
}
参考这个博主
https://blog.****.net/qq_25814297/article/details/123082048
https://www.eeworld.com.cn/mcu/eic669733.html
上述说的是收到一个字节的数据时RXNE变为1,一直到IDLE变为1的时候证明这一包数据接收完毕了,要读掉这两个变量,下次才能继续。
原理就是一个字节一个自己的接收,直到IDLE变为1,我进行清除。再进行接收