方式一:空闲中断
思路:
当接收到数据之后会触发串口中断但是你确定不了,发送方是否发完数据,所以在接收中断的基础上加了一个空闲线的中断,使用空闲线中断确定数据是否传输完成,数据传输完成之后,就可以处理数据了 (以STM32L031为例,不同可能cube的配置不同但是不影响)
实际操作:
先给串口开启中断
1.先把串口打开
之后生成之后,写一下代码,注意代码的位置:
右击函数追进去:
如果追不进来的话:就CTRL+F搜索
找到之后:
是这样的一个中断服务程序,一会我们在这里面和main里面写代码
填写代码:
法1(输出用hal库的函数):
法2:(输出用printf)
更偏向于应用:
main.c
我们要用printf重定向输出就要用到C库,并且还有fputc函数:
具体操作如下:
之后写一个函数
写入头文件:
#include<stdio.h>
在主函数外添加函数:
int fputc(int ch, FILE * p)
{
while(!(USART1->ISR & 1<<7));//等待TDR为空,即TXE置1,跳出while,然后往TDR中放数据
USART1->TDR=ch;
}
这样就可以用printf输出了,接下来我们进入正题:
添加如下代码在
volatile uint8_t USART2_RxBuff[1024];
volatile uint8_t USART2_RxCounter=0;
将此代码放在while(1)上面
HAL_UART_Receive_IT(&huart2, USART2_RxBuff,1024);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);//空闲中断
while(1)内部代码为:
if(USART2_RxCounter)
{
printf("正在处理数据:%s.....\n",USART2_RxBuff);
USART2_RxCounter=0;
memset( USART2_RxBuff,0,1024);
}
中断服务程序中修改代码:
extern uint8_t USART2_RxBuff[1024];
extern uint8_t USART2_RxCounter;
if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) == SET)
//判断是否触发串口空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2); //清除空闲中断标志
huart2.RxXferCount = 1024;//初始化接收的最大数据量
huart2.pRxBuffPtr = USART2_RxBuff;//定义缓冲区
USART2_RxCounter=1;//标识标识数据接收完毕
HAL_UART_Receive_IT(&huart2, USART2_RxBuff,1024);
}
串口调试助手:
方式二:空闲中断+DMA
要进行cube配置:
也可以参考以上文章内容:
如果出现问题无法接收到,可以参考STM32不定长接收 空闲中断+DMA bug解决-优快云博客