串口的不定长接收(两种方式)

方式一:空闲中断

思路:

当接收到数据之后会触发串口中断但是你确定不了,发送方是否发完数据,所以在接收中断的基础上加了一个空闲线的中断,使用空闲线中断确定数据是否传输完成,数据传输完成之后,就可以处理数据了 (以STM32L031为例,不同可能cube的配置不同但是不影响)

实际操作:

先给串口开启中断

1.先把串口打开

之后生成之后,写一下代码,注意代码的位置:

右击函数追进去:

如果追不进来的话:就CTRL+F搜索

找到之后:

是这样的一个中断服务程序,一会我们在这里面和main里面写代码

填写代码:

法1(输出用hal库的函数):

转载:https://x-tao.blog.youkuaiyun.com/article/details/139193387?fromshare=blogdetail&sharetype=blogdetail&sharerId=139193387&sharerefer=PC&sharesource=m0_69487786&sharefrom=from_linkhttps://x-tao.blog.youkuaiyun.com/article/details/139193387?fromshare=blogdetail&sharetype=blogdetail&sharerId=139193387&sharerefer=PC&sharesource=m0_69487786&sharefrom=from_link

法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解决-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值