海陵HLK-TX510人脸识别模块 stm32使用
一.主函数
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "lcd.h"
#include "dht11.h"
#include "IOput.h"
#include "usart.h"
//#include "adc.h" // ADC初始化头文件
#include "TX510.h"
u8 show_flag,show1_flag,max_wd=40,dec_wd=10,max_sd=70,dec_sd=20,yw=0,maxyw=40;
long times_cont=0; // 定义计数变量
//21 为检测到人脸
//28 未注册成员
//26 2D
extern u8 result,userID;
extern uint8_t deletesingleList[];
int main (void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
DHT11_Init();
OLED_Init();
delay_ms(1);
OLED_Clear();
output_init();
input_init();
Usart1_Init(115200); // 初始化USART1并设置波特率为9600
delay_ms(100);
while(1)
{
//删除所有
deleteALLuser();
//删除单个用户
DeleteIndividual(0x0,0x0);
//解析数据
getUserregister();
OLED_ShowNum(0,0,result,2,16);
OLED_ShowNum(0,2,userID,2,16);
OLED_ShowNum(0,4,deletesingleList[9],2,16);
}
}
二.TX510.H
#ifndef __TX510_H
#define __TX510_H
#include "sys.h"
//解析返回数据包数据
void getUserregister();
// 发送数据包 需要额为指令可通过此函数发送数据包
void Serial_SendArray(uint8_t *Array, uint16_t Length);
//删除全部数据
void deleteALLuser();
//删除单个数据
//删除单个 参数说明 userDeleteId2 16进制第1位 userDeleteId1 16进制第2位
// DeleteIndividual(0,1) 删除id为1的用户
void DeleteIndividual(uint8_t userDeleteId1,uint8_t userDeleteId2);
#endif
三.TX510.C
#include "usart.h"
#include "TX510.h"
//串口中断
uint8_t RxData; //数据转存
u16 serial_RxPack[20]={0}; //接收数据的数组
u16 Serial_RXFlag=0; //接收完成标志位
u16 faceIndex=0;
void USART1_IRQHandler(void)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
{
//接收串口发来的数据
RxData=USART_ReceiveData(USART1);
//判断是否为包头
if(RxData==0xEF){
//判断校验位
//清空标志位
Serial_RXFlag=0;
}
//存储数据
serial_RxPack[Serial_RXFlag]=RxData;
Serial_RXFlag++;
}
}
/**********************************************
函数说明:
数据包返回解析函数
result 0成功 0X1 无人脸 0x3人脸姿态角度过大 0x6 2d活体未通过 0x7 三d活体 未通过 0x08 匹配为通过 0x09 重复注册 0x0a保存id失败
userID 用户id
**********************************************/
u8 result=99;
u8 userID=99;
void getUserregister(){
//判断包头和id结果位
if(serial_RxPack[0]==0xEF&&serial_RxPack[1]==0xAA){
//提示位
result=serial_RxPack[8];
//判读是否注册成功
if(serial_RxPack[8]==0x00){
userID=serial_RxPack[9]*10+serial_RxPack[10];
}
}
};
//单字节发送
void Serial_SendByte(uint8_t Byte)
{
USART_SendData(USART1,Byte);
/* USARTx->DR = (Data & (uint16_t)0x01FF);//数据最终通向TDR(发送数据寄存器) TDR再传递给移位寄存器 最终一位一位把数据移出Tx引脚 完成数据发送*/
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完成
};
//多字节发送
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
uint16_t i;
for(i=0;i<Length;i++)
{
Serial_SendByte(Array[i]); //依次调用Serial_SendByte发送每个字节数据
}
};
//删除单个 参数说明 userDeleteId1 16进制第1位 userDeleteId2 16进制第2位
uint8_t deletesingleList[]={0xEF,0xAA,0x20,0x00,0x00,0x00,0x02,0x00,0x00,0x22};
//EF AA 20 00 00 00 02 00 01 23
void DeleteIndividual(uint8_t userDeleteId1,uint8_t userDeleteId2){
int i=0;
int check=0;
deletesingleList[7]=userDeleteId1;
deletesingleList[8]=userDeleteId2;
//校验位修改
for(i=2;i<=8;i++){
check+=deletesingleList[i];
}
deletesingleList[9]=check;
Serial_SendArray(deletesingleList,10);
};
//删除全部;
uint8_t deleteall[]={0xEF,0xAA,0x21,0x00,0x00,0x00,0x00,0x21};
void deleteALLuser(){
Serial_SendArray(deleteall,8);
};
userID为对应的id
result 为对应的提示位
此逻辑只封装了删除和接受返回数据
其他基本指令只需数组中字节数据即可
直接调用 Serial_SendArray()函数;
其中参数一为数据包 参数二为长度
如:
uint8_t deleteall[]={0xEF,0xAA,0x21,0x00,0x00,0x00,0x00,0x21};
void deleteALLuser(){
Serial_SendArray(deleteall,8);
};
其他指令可看手册