——来自迪文开发者论坛
本期为大家推送迪文开发者论坛获奖开源案例——基于T5L的指纹识别解决方案。该方案通过智能屏串口进行Modbus通讯,实现对指纹识别模块的精准控制,并集成了指纹录入与识别功能。可用于门禁管理、员工考勤、智能门锁等场景,为用户带来更为便捷、安全的交互体验。
【演示视频】
完整开发资料含迪文屏DGUS工程资料与C51代码,获取方式:
1. 前往迪文开发者论坛获取:/index.html/forum.php?mod=viewthread&tid=10571&extra=page%3D1&_dsign=ea69763b
2. 微信公众号中回复“指纹识别门锁”获取。
【UI素材展示】
【GUI工程设计】
【C51工程设计】
屏幕进行modbus通讯的部分代码如下:
int main(void)
{
INIT_CPU();
T2_Init();
UART4_Init();
EA=1;
// UART4_SendStr("hello",sizeof("hello"));
WDT_ON();//打开开门狗
while(1)
{
WDT_RST();//喂狗
Process();
}
}
void MainMachineHandle(void)
{
if(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!= ((Tdata[len-1])<<8 | (Tdata[len-2])))
returnfalse;
//这个为写指令
if(Tdata[0]==0&& Tdata[1]!=0x06)
{
returnfalse;
}
elseif(Tdata[0]!=DevAddr) //设备地址
{
returnfalse;
}
//这个为写指令
if(Tdata[1]!=0x03&& Tdata[1]!=0x06 && Tdata[1]!=0x10 )
{
SendModbusAckErr(Tdata,1);
returnfalse;
}
Wlen=(Tdata[4]<<8|Tdata[5]); //长度
BegAddr=(Tdata[2]<<8|Tdata[3]); //开始地址
if(Tdata[1]==0x06)//写内存
{
write_dgusii_vp(BegAddr,&Tdata[4],1);
}
elseif(Tdata[1]==0x10)
{
write_dgusii_vp(BegAddr,&Tdata[7],Wlen);
}
//读操作响应
//[01][0x03][00][6B][00][02][CRC高][CRC低]
if(Tdata[1]==0x03)
{
RetData[0]=Tdata[0];
RetData[1]=0x03;
RetData[2]=Wlen*2;
read_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);
}
elseif(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]) //当地址码为真,才应答
{
memcpy(RetData,Tdata,8);
SendModbusAckOK(RetData,8);
}
returntrue;
}