【Código Aberto】Solução de Reconhecimento de Impressão Digital Baseada em Tela Inteligente T5L
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】

【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;
}







