串口不定长接收(定时器)

本文介绍了一种利用STM32G431的CUBEMX配置,通过1ms定时器中断控制串口不定长接收的方法。当接收到1个字符后启动35ms计时,若在该时间内未接收到新的字符则发送结束信号。主要涉及定时器和串口的设置及中断回调函数的编写。

板子型号:STM32G431
使用软件:CUBEMX


思路:定时器中断控制串口不定长接收
1ms定时器扫描,每次接收到1个符号就开始计时35ms,不断的接收可以重复写入35ms。
接收不到时,等待35ms,就置结束符号为1,进行串口发送。


一、CUBEMX设置

PS:用cubemx主要是因为想偷懒,省略掉一些初始化配置。

在这里插入图片描述
USART1:
在这里插入图片描述
TIM3:
在这里插入图片描述

二、代码部分

1.定义

代码如下:

 typedef union{
	struct{
		uint8_t receiveyes:1; //确认接收符号
		uint8_t receiveend:1; //结束接收符号
	}FlagStatus;
uint8_t count;
}Bitvar;
 
Bitvar sign;
unsigned char time;

uint16_t rdata[50];//最终接收数据存放
uint16_t Rxbuff[1];//接收一个字符

2.定时器回调函数

代码如下:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if(sign.FlagStatus.receiveyes==1){            //如果接收到了
			if(time>0){time--;}
			if(time==0){
				sign.FlagStatus.receiveyes=0;
				sign.FlagStatus.receiveend=1;    //接收不到,符号位置一
				time=35;
			}
	}
}

3.串口接收回调函数

代码如下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		rdata[sign.count++]=Rxbuff[0];	
		sign.FlagStatus.receiveyes=1;             //接收到了
		time=35;                                  //喂time为35
		HAL_UART_Receive_IT(&huart1, (uint8_t *)Rxbuff, 1);
	}
}

4.while循环

while (1)
  {
		HAL_UART_Receive_IT((UART_HandleTypeDef *)&huart1, (uint8_t *)Rxbuff, 1);
		if (sign.FlagStatus.receiveend==1){        //发现接收结束了
			sign.FlagStatus.receiveyes=0;
			sign.FlagStatus.receiveend=0;
			HAL_UART_Transmit((UART_HandleTypeDef *)&huart1, (uint8_t *)rdata, 50, 999);
      memset(rdata,0,sizeof rdata);
			sign.count=0;                         //下次接收,从0开始
		}
 }

三、最终效果

在这里插入图片描述

看到这里了,点个赞呗!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值