找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于单片机rfid模块校验程序调试

查看数: 1915 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-4-13 14:31

正文摘要:

最近在想搞一个小门禁试试玩。在某一个宝上买了一个rfid模块, 其中02,03是头尾码,不参与运算。 中间的10位是ascii格式的数据, 我自己写了个校验程序,好像不是很成功,看看有大神能帮忙改下吗?顺便求一个 ...

回复

ID:844772 发表于 2021-4-14 16:40
ttmax3 发表于 2021-4-14 15:45
最终程序
void idcard(void)        //读取id卡号
{

是不是非要弄这么多位的数字啊,你至少需要5个字节啊,要用51的话你需要变量合并用了。还有那么大的数,就别乘了,用移位计算好一点,还不容易出错。
ID:510170 发表于 2021-4-14 15:45
最终程序
void idcard(void)        //读取id卡号
{
        u8 i;       
        for(i=0; i<10; i++)        idbuf[i]=RX2_Buffer[i+1];//取其中10位存入读内存
        for(i=0; i<10; i++)        idbuf[i]=ascii_tohex(idbuf[i]);//ascii转码
        idbuf[10]=(idbuf[0]<<4)|idbuf[1];//合并后运算出校验码
        idbuf[11]=(idbuf[2]<<4)|idbuf[3];
        idbuf[12]=(idbuf[4]<<4)|idbuf[5];
        idbuf[13]=(idbuf[6]<<4)|idbuf[7];
        idbuf[14]=(idbuf[8]<<4)|idbuf[9];               
        idbuf[15]=idbuf[10]^idbuf[11]^idbuf[12]^idbuf[13]^idbuf[14];                //校验码                                       
        id=(idbuf[2]*268435456)+(idbuf[3]*16777216)+(idbuf[4]*1048576)+(idbuf[5]*65536)+(idbuf[6]*4096)+(idbuf[7]*256)+(idbuf[8]*16)+idbuf[9];//转10进制数以便分解显示
}//这里我只算出了校验码,没有做进一步的动作,要注意的是id要设成全局变量,直接分解,要中转的话读出来的就全部是0.
ID:510170 发表于 2021-4-13 19:47
改掉了,能校验了。程序如下
u8 ascii_tohex(u8 ascii_data)//ascii转hex函数
{
        u8 hex_data=0;//定义hex变量存储转换结果
                if(ascii_data>=0x30&&ascii_data<=0x39)
                        hex_data=ascii_data-0x30;//若转换内容为字符'0-9',则转成对应数字0-9
                else
                        hex_data=ascii_data-0x37;//若转换内容为字符'a-f',则转成数字10-15
                return hex_data;//返回转换结果,非以上字符,不在hex(0-f)范围内,默认0
}
for(i=0; i<COM2.RX_Cnt; i++)        TX1_write2buff(RX2_Buffer[i]);        //收到的数据原样返回
                                        for(i=0; i<10; i++)        rxbuf[i]=RX2_Buffer[i+1];
                                        for(i=0; i<10; i++)        TX1_write2buff(rxbuf[i]);
                                        for(i=0; i<10; i++)        rxbuf[i]=ascii_tohex(rxbuf[i]);
                                        for(i=0; i<10; i++)        TX1_write2buff(rxbuf[i]);
                                        //for(i=0; i<10; i+2) (rxbuf[i]<<4)|rxbuf[i+1];
                                        rxbuf[10]=(rxbuf[0]<<4)|rxbuf[1];
                                        rxbuf[11]=(rxbuf[2]<<4)|rxbuf[3];
                                        rxbuf[12]=(rxbuf[4]<<4)|rxbuf[5];
                                        rxbuf[13]=(rxbuf[6]<<4)|rxbuf[7];
                                        rxbuf[14]=(rxbuf[8]<<4)|rxbuf[9];               
                                        rxbuf[15]=rxbuf[10]^rxbuf[11]^rxbuf[12]^rxbuf[13]^rxbuf[14];               
                                        for(i=10; i<16; i++)        TX1_write2buff(rxbuf[i]);


通过串口返回的数据是
02 33 36 30 30 32 44 36 38 38 35 F6 03
33 36 30 30 32 44 36 38 38 35
03 06 00 00 02 0D 06 08 08 05
36 00 2D 68 85
F6

剩下就是要把00 2D 68 85合并成一个十进制的数2975877
目前还没有头绪,搞好了,再报告。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表