12.利用定时器进行串口不定长数据发送

文章描述了一个使用STM32G4xx的CUBEMAX配置中,通过USART1进行数据接收,并验证输入密码的示例。代码展示了如何在接收到完整数据后进行错误检查和密码解码,以及相应的错误处理和清零操作。
摘要由CSDN通过智能技术生成

1.CUBEMAX配置

2.题目要求实现

3.代码模板实现

char rxdata[30];
char txdata[30];
uint8_t rxdat;
uint8_t rx_count;
uint8_t rx_timer;
bool rx_finish_flag;
uint8_t password[3]={1,2,3};


void setup()
{
 HAL_TIM_Base_Start_IT(&htim4);
 HAL_UART_Receive_IT(&huart1, &rxdat, 1);
}

void loop()
{
  usart_proc();
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		rx_timer=0;
		rx_finish_flag=0;
		rxdata[rx_count++]=rxdat;
		HAL_UART_Receive_IT(&huart1,&rxdat,1);
	}
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 if(htim->Instance==TIM4)
 {
	 if(rx_finish_flag==0)rx_timer++;
 }
}

void usart_proc()
{
 if(rx_count>0)
 {
     if(rx_timer>=3)
     {
       rx_timer=0;
       if(rxdata[rx_count-1]==rxdat)rx_finish_flag=1;
     }

 if(rx_finish_flag==1)
 {
       rx_finish_flag=0;
       if(rx_count==7)
       {
        if(rxdata[3]=='-'&&rxdata[4]>='0'&&rxdata[4]<='9'&&rxdata[5]>='0'&&rxdata[5]                
   <='9'&&rxdata[6]>='0'&&rxdata[6]<='9'&&rxdata[0]-'0'==password[0]&&rxdata[1]- 
   '0'==password[1]&&rxdata[2]-'0'==password[2])
    {
	password[0]=rxdata[4]-'0';
	password[1]=rxdata[5]-'0';
	password[2]=rxdata[6]-'0';
	sprintf(txdata,"Successfully\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
	}
	else{
	sprintf(txdata,"Errror\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
	}  
   }
       else{
        sprintf(txdata,"Errror\r\n");
	    HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
       }
   rx_count=0;//这一段放在 if(rx_finish_flag==1)里面
   memset(rxdata,0,sizeof(rxdata));
  }
 
 }
}


#ifndef __fun_h
#define __fun_h
#include "stm32G4xx.h"
#include "head.h"
void setup(void);
void loop(void);

void usart_proc(void);
#endif

4.代码模板实现二 

void usart_proc()
{

   if(rx_count==7)
   {
    if(rxdata[3]=='-'&&rxdata[4]>='0'&&rxdata[4]<='9'&&rxdata[5]>='0'&&rxdata[5]<='9'&&rxdata[6]>='0'&&rxdata[6]<='9'&&rxdata[0]-'0'==password[0]&&rxdata[1]-'0'==password[1]&&rxdata[2]-'0'==password[2])
    {
	password[0]=rxdata[4]-'0';
	password[1]=rxdata[5]-'0';
	password[2]=rxdata[6]-'0';
	sprintf(txdata,"Successfully\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
	}
	else{
	sprintf(txdata,"Errror\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
	}  
   }
   else{
    sprintf(txdata,"Errror\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
   }
   rx_count=0;
   memset(rxdata,0,sizeof(rxdata));
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		rxdata[rx_count++]=rxdat;
		HAL_UART_Receive_IT(&huart1,&rxdat,1);
	}
}

void loop()
{
 if(rx_count!=0)
 {
  int temp=rx_count;
  HAL_Delay(1);
	if(temp==rx_count) usart_proc();
 }
 

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值