ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从录入到识别:智能门禁里 AS608 指纹模块的完整工作流程

从录入到识别:智能门禁里 AS608 指纹模块的完整工作流程 从录入到识别智能门禁里 AS608 指纹模块的完整工作流程本文基于 B11 智能门禁实验整理硬件平台 STM32L431VCT6 Huawei LiteOS指纹模块为正点原子 ATK-AS608AS60x 系列串口速率 57600LPUART1。代码文件Hardware/AS_608/handle.c、Hardware/AS_608/as_608.c。项目背景门禁系统除了按键、红外之外还集成了指纹识别录入把一枚手指登记进指纹库分配一个 ID和识别按下手指从指纹库里找到匹配的 ID成功则开门。这两个动作背后其实是 AS608 模块的一条条串口指令在来回应答。AS608 是串口指令式指纹模块主机发一包 16 进制指令如取图像“生成特征”模块执行后回一包应答应答里带一个确认字00H 表示成功其他值表示各种失败原因。理解了这一点整个指纹流程就变成了一张指令状态图。指令包与应答包指令包EF 01 | 芯片地址(4B) | 包标识 01H | 包长度(2B) | 指令码 | 参数 | 校验和(2B)其中包长度 指令码 1 字节 参数长度 校验和 2 字节。应答包包标识为 07H确认字在数据区第 10 字节代码里 data[9]00H 表示执行成功。工程里组包发送和等应答各封装成一个函数C复制static void SendMessageDate_v2(u8 flag, u8 cmd, u8* data, short datalen); // 组包 uart_write 发送static u8 *JudgeStr(u16 waittime); // 等应答包返回 data[9] 确认字所有指令函数都是发指令 → 等应答 → 取确认字三步例如取图像C复制u8 PS_GetImage(void){u8 ensure;u8 *data;SendMessageDate_v2(0x01, 0x01, NULL, 0); // 指令码 01H录入指纹图像data JudgeStr(2000);ensure data ? data[9] : 0xff; // 0xff 超时return ensure;}3. 录入指纹一个五状态的有限状态机录入函数是 Add_FR(u16 id)handle.c 第 232 行起由按键 Key1 触发。它把两次采集 → 校验一致 → 合并 → 存储拆成了 5 个状态用 processnum 驱动状态 动作 指令 成功后的去向case 0 第 1 次采集取图 → 生成特征到 CharBuffer1 PS_GetImage → PS_GenChar(BufferID1) processnum1case 1 第 2 次采集取图 → 生成特征到 CharBuffer2 PS_GetImage → PS_GenChar(BufferID2) processnum2case 2 校验两次特征是否同一手指 PS_Match 一致 → 3不一致 → 回到 0 重来case 3 合并两个缓冲区的特征生成模板 PS_RegModel processnum4case 4 把模板存到指定 ID PS_StoreChar(BufferID2, id) 返回 0录入成功以第 1 次采集为例对应实验指导书流程图的录入指纹流程左列C复制case 0:i;printf(“请开始录入指纹\r\n”); // 提示按手指ensure PS_GetImage(); // 步骤2发送取图像指令等待应答if (ensure 0x00) // 步骤3读取到图像{ensure PS_GenChar(CharBuffer1); // 步骤4生成特征BufferID1if (ensure 0x00) // 步骤5OK{printf(“指纹正确\r\n”);i 0;processnum 1; // 进入第 2 次采集}elseShowErrMessage(ensure); // 特征生成失败返回重试}elseShowErrMessage(ensure); // 没读到图像返回重试break;两次特征必须分别放进 CharBuffer1 和 CharBuffer2PS_Match 校验通过后 PS_RegModel 才能把两者合并成模板最后存储C复制case 4:ensure PS_StoreChar(CharBuffer2, id); // 存储模板到指纹库 id 号if (ensure 0x00){printf(“录入指纹成功, 指纹号 %d!!!\r\n”, id);PS_ValidTempleteNum(ValidN); // 刷新有效模板数return 0;}break;整个录入循环还有一个保护i 在每次采集时自增i 10约 5 次完整尝试仍没成功就自动退出避免一直卡住。刷指纹识别从手指按下到开门识别侧由 AS608_Handle() 主循环handle.c 第 114 行驱动握手 → 读模板数 → 循环检测手指识别成功返回 0 就开门开门超 5 秒自动关门C复制while (1){if (Finger_press() 0) // 刷指纹成功door_open_close_operation(DOOR_OPEN);cur_time HAL_GetTick(); if (cur_time - open_time 5000) // 开门超过 5 秒 if (as608_get_door_status() DOOR_OPEN) door_open_close_operation(DOOR_CLOSED); LOS_TaskDelay(10);}Finger_press()第 197 行先读触摸感应引脚 PC6对应流程图右列的 PS_StaIO连续 3 次、每次延时 100ms 消抖确认按下后调用 press_FR()C复制u8 press_FR(void) // 刷指纹核心handle.c 第 357 行{SearchResult seach;u8 ensure;ensure PS_GetImage(); // 取图像 if (ensure 0x00) { ensure PS_GenChar(CharBuffer1); // 生成特征 if (ensure 0x00) { ensure PS_HighSpeedSearch(CharBuffer1, 0, 300, seach); // 搜索整个指纹库 if (ensure 0x00) // 搜索成功 { printf(Match ID:%d Match score:%d \r\n, seach.pageID, seach.mathscore); return 0; // 返回 0 → 主循环开门 } } } ShowErrMessage(ensure); return ensure;}PS_HighSpeedSearch 的指令码是 1BH参数与手册的 PS_Search04H完全一致BufferID、StartPage0、PageNum300应答会带回命中的 PageID即指纹 ID和匹配得分。
返回列表