熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2021-4-13 14:31
正文摘要:最近在想搞一個(gè)小門禁試試玩。在某一個(gè)寶上買了一個(gè)rfid模塊, 其中02,03是頭尾碼,不參與運(yùn)算。 中間的10位是ascii格式的數(shù)據(jù), 我自己寫了個(gè)校驗(yàn)程序,好像不是很成功,看看有大神能幫忙改下嗎?順便求一個(gè) ... |
ttmax3 發(fā)表于 2021-4-14 15:45 是不是非要弄這么多位的數(shù)字啊,你至少需要5個(gè)字節(jié)啊,要用51的話你需要變量合并用了。還有那么大的數(shù),就別乘了,用移位計(jì)算好一點(diǎn),還不容易出錯(cuò)。 |
最終程序 void idcard(void) //讀取id卡號(hào) { 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];//合并后運(yùn)算出校驗(yàn)碼 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]; //校驗(yàn)碼 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進(jìn)制數(shù)以便分解顯示 }//這里我只算出了校驗(yàn)碼,沒有做進(jìn)一步的動(dòng)作,要注意的是id要設(shè)成全局變量,直接分解,要中轉(zhuǎn)的話讀出來的就全部是0. |
改掉了,能校驗(yàn)了。程序如下 u8 ascii_tohex(u8 ascii_data)//ascii轉(zhuǎn)hex函數(shù) { u8 hex_data=0;//定義hex變量存儲(chǔ)轉(zhuǎn)換結(jié)果 if(ascii_data>=0x30&&ascii_data<=0x39) hex_data=ascii_data-0x30;//若轉(zhuǎn)換內(nèi)容為字符'0-9',則轉(zhuǎn)成對(duì)應(yīng)數(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),默認(rèn)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合并成一個(gè)十進(jìn)制的數(shù)2975877 目前還沒有頭緒,搞好了,再報(bào)告。 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
Powered by 單片機(jī)教程網(wǎng)