Leave Your Message

【Código Aberto】Solução de Reconhecimento de Impressão Digital Baseada em Tela Inteligente T5L

15/07/2024

Apresentamos aqui um caso de código aberto de DWIN Fórum de desenvolvedores - solução de identificação por impressão digital baseada em T5L.

A solução baseia-se na comunicação Modbus através da porta serial da tela inteligente, permitindo o controle preciso do módulo de identificação por impressão digital e integrando as funções de entrada e identificação por impressão digital. PODE Pode ser utilizado para gerenciamento de controle de acesso, registro de presença de funcionários, fechaduras inteligentes e outros cenários, proporcionando aos usuários uma experiência de interação mais conveniente e segura.

【Design da interface gráfica】

1569.png

 

Design C51

Parte do código para a tela realizar a comunicação Modbus é a seguinte:

 

int main(void)

{

INIT_CPU();

T2_Calor();

UART4_Init();

EA=1;

// UART4_SendStr("hello",sizeof("hello"));

WDT_ON();//Abre o cão de vigilância

enquanto(1)

{

WDT_RST();//Alimente o cachorro

Processo();

}

}

void MainMachineHandle(void)

{

se(UartDataHandle)

{

uartHandle(Uart4_Rx,uart4_rx_count);

CLR_UartMp3();

}

}

bool uartHandle(u8 *Tdata,u8 len)

{

u16Wlen=0;

u16CRC_1=0,BegAddr=0;

u8 xdata RetData[Uart4_Rx_Maxlen+10];

u8 errnum=0;

CRC_1=CalcCrcAll(0xffff,Tdata,len-2);

if(CRC_1!= ((Tdados[len-1])

retornar falso;

// Este é um comando de escrita

se(Tdata[0]==0&& Tdata[1]!=0x06)

{

retornar falso;

}

elseif(Tdata[0]!=DevAddr) // endereço do dispositivo

{

retornar falso;

}

// Este é um comando de escrita

se(Tdata[1]!=0x03&& Tdata[1]!=0x06 && Tdata[1]!=0x10 )

{

SendModbusAckErr(Tdata,1);

retornar falso;

}

Wlen=(Tdata[4]

BegAddr=(Tdata[2]

if(Tdata[1]==0x06)// Escrever na memória

{

write_dgusii_vp(BegAddr,&Tdata[4],1);

}

senão se(Tdata[1]==0x10)

{

write_dgusii_vp(BegAddr,&Tdata[7],Wlen);

}

// Resposta da operação de leitura

//[01][0x03][00][6B][00][02][CRC Alto][CRC Baixo]

se(Tdata[1]==0x03)

{

RetData[0]=Tdata[0];

RetData[1]=0x03;

RetData[2]=Wlen*2;

ler_dgusii_vp(BegAddr,&RetData[3],Wlen);

CRC_1=CalcCrcAll(0xFFFF,RetData,3+Wlen*2);

RetData[Wlen*2+3]=CRC_1;

RetData[Wlen*2+3+1]=CRC_1>>8;

SendModbusAckOK(RetData,3+Wlen*2+2);

}

senão se(Tdata[1]==0x10)

{

memcpy(RetData,Tdata,6);

CRC_1=CalcCrcAll(0xFFFF,(INT8U*)&RetData,6);

RetData[6]=CRC_1;

RetData[7]=CRC_1>>8;

SendModbusAckOK(RetData,8);

}

elseif(Tdata[1]==0x06 && Tdata[0]) // Resposta quando o código de endereço for verdadeiro

{

memcpy(RetData,Tdata,8);

SendModbusAckOK(RetData,8);

}

retornar verdadeiro;

}