找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1914|回复: 3
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
最近在想搞一个小门禁试试玩。在某一个宝上买了一个rfid模块,
能通过串口获得一组数据,
其中02,03是头尾码,不参与运算。
中间的10位是ascii格式的数据,
我自己写了个校验程序,好像不是很成功,看看有大神能帮忙改下吗?顺便求一个将后4位16进制的数合并为一个10进制的字符串。谢谢了。

单片机源程序如下:
  1. void idcrc(void)
  2. {
  3. unsigned char i=10;
  4.         idok=ider=0;
  5.         if(receBuf[1]==0x02)
  6.         {
  7.                 while (i--) //传输消息缓冲区
  8.                 {
  9.                         receBuf1[i]=receBuf[i+1]-0x30;               
  10.                 }
  11.                 receBuf1[11]=receBuf1[1]<<4|receBuf1[2];
  12.                 receBuf1[12]=receBuf1[3]<<4|receBuf1[4];               
  13.                 receBuf1[13]=receBuf1[5]<<4|receBuf1[6];
  14.                 receBuf1[14]=receBuf1[7]<<4|receBuf1[8];
  15.                 receBuf1[15]=receBuf1[9]<<4|receBuf1[10];               
  16.          idcr=receBuf1[11]^receBuf1[12]^receBuf1[13]^receBuf1[14]^receBuf1[15];
  17.                
  18.         }
  19.         if(idcr==receBuf[12])
  20.         {
  21.                 idok=1;
  22.                
  23.         }
  24.         else ider=1;
  25.         
  26. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
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:844772 发表于 2021-4-14 16:40 | 只看该作者
ttmax3 发表于 2021-4-14 15:45
最终程序
void idcard(void)        //读取id卡号
{

是不是非要弄这么多位的数字啊,你至少需要5个字节啊,要用51的话你需要变量合并用了。还有那么大的数,就别乘了,用移位计算好一点,还不容易出错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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