找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1814|回復: 3
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機rfid模塊校驗程序調(diào)試

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:510170 發(fā)表于 2021-4-13 14:31 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在想搞一個小門禁試試玩。在某一個寶上買了一個rfid模塊,
能通過串口獲得一組數(shù)據(jù),
其中02,03是頭尾碼,不參與運算。
中間的10位是ascii格式的數(shù)據(jù),
我自己寫了個校驗程序,好像不是很成功,看看有大神能幫忙改下嗎?順便求一個將后4位16進制的數(shù)合并為一個10進制的字符串。謝謝了。

單片機源程序如下:
  1. void idcrc(void)
  2. {
  3. unsigned char i=10;
  4.         idok=ider=0;
  5.         if(receBuf[1]==0x02)
  6.         {
  7.                 while (i--) //傳輸消息緩沖區(qū)
  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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:510170 發(fā)表于 2021-4-13 19:47 | 只看該作者
改掉了,能校驗了。程序如下
u8 ascii_tohex(u8 ascii_data)//ascii轉(zhuǎn)hex函數(shù)
{
        u8 hex_data=0;//定義hex變量存儲轉(zhuǎn)換結(jié)果
                if(ascii_data>=0x30&&ascii_data<=0x39)
                        hex_data=ascii_data-0x30;//若轉(zhuǎn)換內(nèi)容為字符'0-9',則轉(zhuǎn)成對應數(shù)字0-9
                else
                        hex_data=ascii_data-0x37;//若轉(zhuǎn)換內(nèi)容為字符'a-f',則轉(zhuǎn)成數(shù)字10-15
                return hex_data;//返回轉(zhuǎn)換結(jié)果,非以上字符,不在hex(0-f)范圍內(nèi),默認0
}
for(i=0; i<COM2.RX_Cnt; i++)        TX1_write2buff(RX2_Buffer[i]);        //收到的數(shù)據(jù)原樣返回
                                        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]);


通過串口返回的數(shù)據(jù)是
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合并成一個十進制的數(shù)2975877
目前還沒有頭緒,搞好了,再報告。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:510170 發(fā)表于 2021-4-14 15:45 | 只看該作者
最終程序
void idcard(void)        //讀取id卡號
{
        u8 i;       
        for(i=0; i<10; i++)        idbuf[i]=RX2_Buffer[i+1];//取其中10位存入讀內(nèi)存
        for(i=0; i<10; i++)        idbuf[i]=ascii_tohex(idbuf[i]);//ascii轉(zhuǎn)碼
        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];//轉(zhuǎn)10進制數(shù)以便分解顯示
}//這里我只算出了校驗碼,沒有做進一步的動作,要注意的是id要設(shè)成全局變量,直接分解,要中轉(zhuǎn)的話讀出來的就全部是0.
回復

使用道具 舉報

地板
ID:844772 發(fā)表于 2021-4-14 16:40 | 只看該作者
ttmax3 發(fā)表于 2021-4-14 15:45
最終程序
void idcard(void)        //讀取id卡號
{

是不是非要弄這么多位的數(shù)字啊,你至少需要5個字節(jié)啊,要用51的話你需要變量合并用了。還有那么大的數(shù),就別乘了,用移位計算好一點,還不容易出錯。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表