ttmax3 发表于 2021-4-14 15:45 是不是非要弄这么多位的数字啊,你至少需要5个字节啊,要用51的话你需要变量合并用了。还有那么大的数,就别乘了,用移位计算好一点,还不容易出错。 |
最终程序 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. |
改掉了,能校验了。程序如下 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 目前还没有头绪,搞好了,再报告。 |