STM32智能门锁学习三[完],AS608指纹解锁

本文介绍了使用STM32微控制器通过串口与指纹模块进行交互,实现指纹录入和识别功能的过程。首先通过上位机软件测试模块功能,然后在Cube配置中设置串口3并启用中断。接着编写代码,包括指纹录入和验证两个函数,遇到问题发现是波特率设置不正确导致。解决后,系统能够成功执行指纹识别操作,实现智能门锁的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候,心梗只在一瞬间,卡了很久的指纹模块今天突然发现是波特率的原因===

先来看一下指纹模块:

到手的模块应该是只有6根线,不过我们只需要接前4根线即可,不需要接后面的,因为指纹模块是通过串口发送指令,让模块识别有无手指按下。

我们要先用上位机软件对其进行调试,用串口和指纹模块连起来接在电脑上,打开我们的软件,进行录入指纹,搜索指纹等操作,用来判断模块是否是好的,不过这并不代表已经录入指纹了,到时候还是得通过程序录入指纹。

 测试没问题之后,就进行我们的cube配置,这里用的是串口3,并使能中断。

 然后是代码部分:

先测试录入指纹的函数:

//录指纹
void Add_FR(void)
{
  uint8_t i, ensure, processnum = 0;
  uint8_t ID_NUM = 0;
  while(1)
  {
    switch (processnum)
    {
    case 0:
      i++;
			printf("请按手指\r\n");
      ensure = PS_GetImage();
      if(ensure == 0x00)
      {
        ensure = PS_GenChar(CharBuffer1); //生成特征
        if(ensure == 0x00)
        {
					printf("指纹正常\r\n");
          i = 0;
          processnum = 1; //跳到第二步
        }
        else ShowErrMessage(ensure);
      }
      else ShowErrMessage(ensure);
      break;

    case 1:
      i++;
		  printf("请再按一次\r\n");
      ensure = PS_GetImage();
      if(ensure == 0x00)
      {
        ensure = PS_GenChar(CharBuffer2); //生成特征
        if(ensure == 0x00)
        {
					printf("指纹正常\r\n");
          i = 0;
          processnum = 2; //跳到第三步
        }
        else ShowErrMessage(ensure);
      }
      else ShowErrMessage(ensure);
      break;

    case 2:
		  printf("对比两次指纹\r\n");
      ensure = PS_Match();
      if(ensure == 0x00)
      {
				printf("对比成功\r\n");
        processnum = 3; //跳到第四步
      }
      else
      {
				printf("对比失败\r\n");
        ShowErrMessage(ensure);
        i = 0;
        processnum = 0; //跳回第一步
      }
      delay_ms(500);
      break;

    case 3:
		  printf("生成指纹模板\r\n");
      delay_ms(500);
      ensure = PS_RegModel();
      if(ensure == 0x00)
      {
				printf("生成指纹模板成功\r\n");
        processnum = 4; //跳到第五步
      }
      else
      {
        processnum = 0;
        ShowErrMessage(ensure);
      }
      delay_ms(1000);
      break;

    case 4:
			printf("默认选择ID为1 \r\n");
		ID_NUM = 1;
		#if 0
      while(key_num != 3)
      {
        key_num = KEY_Scan(0);
        if(key_num == 2)
        {
          key_num = 0;
          if(ID_NUM > 0)
            ID_NUM--;
        }
        if(key_num == 4)
        {
          key_num = 0;
          if(ID_NUM < 99)
            ID_NUM++;
        }
        OLED_ShowCH(40, 6, "ID=");
        OLED_ShowNum(65, 6, ID_NUM, 2, 1);
      }
		
      key_num = 0;
			#endif
      ensure = PS_StoreChar(CharBuffer2, ID_NUM); //储存模板
      if(ensure == 0x00)
      {
				printf("录入指纹成功\r\n");
        delay_ms(1500);
        return ;
      }
      else
      {
        processnum = 0;
        ShowErrMessage(ensure);
      }
      break;
    }
    delay_ms(400);
    if(i == 10) //超过5次没有按手指则退出
    {
      break;
    }
  }
}

录入两次,成功之后再添加刷指纹的函数:

//刷指纹
void press_FR(void)
{
  SearchResult seach;
  uint8_t ensure;
  char str[20];
  while(1)
  {
    //key_num = KEY_Scan(0);
    ensure = PS_GetImage();
    if(ensure == 0x00) //获取图像成功
    {
      ensure = PS_GenChar(CharBuffer1);
      if(ensure == 0x00) //生成特征成功
      {
        ensure = PS_HighSpeedSearch(CharBuffer1, 0, 99, &seach);
        if(ensure == 0x00) //搜索成功
        {
					
			OLED_Clear();//先清屏
			OLED_ShowCHinese(0,0,18);//指
			OLED_ShowCHinese(20,0,19);//纹
			OLED_ShowCHinese(40,0,10);//正
			OLED_ShowCHinese(60,0,11);//确
			OLED_ShowChar(80,0,'!',16);//!
				
			OLED_ShowCHinese(0,3,0); //门 
			OLED_ShowCHinese(20,3,1);//已
			OLED_ShowCHinese(40,3,4);//打
			OLED_ShowCHinese(60,3,5);//开
			OLED_ShowChar(80,3,'!',16);//!	
					
					printf("指纹验证成功");
          sprintf(str, " ID:%d 得分:%d ", seach.pageID, seach.mathscore);
					printf("%s\r\n",str);
          delay_ms(1500);
          delay_ms(1500);
        }
        else
        {
					
			OLED_Clear();//先清屏
			OLED_ShowCHinese(0,0,18);//指
			OLED_ShowCHinese(20,0,19);//纹
			OLED_ShowCHinese(40,0,8);//错
			OLED_ShowCHinese(60,0,9);//误
			OLED_ShowChar(80,0,'!',16);//!
					
			OLED_ShowCHinese(0,3,12); //请
			OLED_ShowCHinese(20,3,15);//重
			OLED_ShowCHinese(40,3,16);//新			
			OLED_ShowCHinese(60,3,13);//输
			OLED_ShowCHinese(80,3,14);//入		
			OLED_ShowChar(100,3,'!',16);//!	
					printf("验证失败\r\n");
          delay_ms(1500);
        }
      }
      else
			{printf ("生成特征失败\r\n");};
			printf("请按手指\r\n");
    }else {
//		printf ("获取图像失败\r\n");
		}
  }
}

就好了。

附上前面部分代码:

(9条消息) STM32智能门锁学习二,RFID刷卡解锁_泡菜鱼111的博客-CSDN博客

=================================================================

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值