串口不定长接收的方法有多种,这里我所介绍的是通过设置IDLE中断来检测串口是否接收完毕,从而结束串口接受中断
1.首先设置串口,如下图所示:
![](https://img-blog.csdnimg.cn/1fbf936b7b584085ba124f8a1d2baeb0.png)
2.使用IDLE中断检测,所以需要开启对应串口的IDLE中断
以下代码都在main.c 中的main函数中,且不在while循环中。
通过查看HAL库手册可以发现__HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)函数可以设置IDLE中断和它的一些可以设置的模式。
![](https://img-blog.csdnimg.cn/7865a30aa043490abb582bc563b83d83.png)
所以设置空闲中断(IDLE中断)的代码为:
//使能空闲中断
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
接下来开启中断接收函数
//使能接收中断,进行接收数据
HAL_UART_Receive_IT(&huart1,buf,256);
//&huart1为自己设置开启的串口
//buf 为自己定义的全局字符数组 长度为256
//256 最多接收256个字节的数据
3.在stm32f1xx_it.c文件中编写关于空闲中断处理
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
//__HAL_UART_GET_FLAG 判断标志位的函数,检测目前串口是否为空闲状态,是 返回 1,否 返回 0 。
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) == SET)
{
int datalen = 0;
//清除空闲中断标志
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
//空闲中断处理
datalen = 256 - huart1.RxXferCount;
//huart1.RxXferCount 可以在 HAL_UART_Receive_IT()函数中查看
//huart->pRxBuffPtr = pData; 存放接收的数组
//huart->RxXferSize = Size; 最大接收的长度
//huart->RxXferCount = Size; 未接收的的长度 (每接收一个字符 RxXferCount就会自减一)
HAL_UART_Transmit(&huart1,buf,datalen,0xffff);
//还原
memset(buf,0,256);//清零buf中的数据
huart1.RxXferCount = 256;
//把未接收的长度 重置为256
huart1.pRxBuffPtr = buf;
//由于pRxBuffPtr 每接收一个字符后就会向后偏移一位,所以需要重新赋予 存放数据数组的首地址
return ;
}
/* USER CODE END USART1_IRQn 0 */
//接收数据中断处理
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
5.编译以后,就可以烧录到板子上了。
测试图
![](https://img-blog.csdnimg.cn/65fe506bb84b42d4b94720794a6c3965.png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)