RDM6300读卡模块读卡代码优化分享
RDM6300读卡模块8-9块一个,拿来做刷卡门锁模块不错,只是网上的代码挺麻烦的,卖家也表示自己优化代码。所以我发上来我优化的读卡代码,直接调用就可以返回卡号。原代码(卖家给的)
long Password1=1111111;//稍后要改为读取到的卡号1
long Password2=2222222;//稍后要改为读取到的卡号2
int flag=0,RX_Flag=0;//串口标志
char Code; //用于存放读到串口数据
long Num=0;//解码数据
int Door=0;
void Read_ID(void)
{
int i=0;
char temp;
for(i=0;(Serial.available()>0);i++) //串口有数据时>0,条件成立,for一直循环z
//while(Serial.available()>0) //Serial.available()获取串口接收缓冲区中字节数
{
temp=Serial.read(); //Serial.read()从串口缓冲区读取1字节数据,之后移除这1字节数据
Serial.print(temp);
delay(2);
Serial.println(i);
if(temp==0X02) //接收起始位
{
flag=1;i=0;RX_Flag=0;
}
if(flag==1) //检测到起始位,开始接收数据
{
if(temp==0X03) //检测到结束码,
{
flag=0; //标志清零
if(i==13) RX_Flag=1; //第13位为结束码,收到数据,标志置1
else RX_Flag=0;
break;
}
Code=temp;
}
}
flag=0; //标志清零
}
void setup()
{
pinMode(13,OUTPUT);
Serial.begin(9600);
}
void loop()
{
int i;
long temp=0,time=0;
RX_Flag=0;
while(1)
{
Read_ID();
if(RX_Flag==1)
{
for(i=5;i<11;i++)//数据解码,6位字符转为十六进制数,对应十进制卡号
{
Num<<=4;
if(Code>64)Num+=((Code)-55);
else Num+=((Code)-48);
Serial.println(Num);
}
Serial.println(Num);
if((Num==Password1)||(Num==Password2))//识别成功
{
digitalWrite(13,HIGH);
delay(5);
while(analogRead(Door)>400);
delay(1000);
digitalWrite(13,LOW);
delay(5);
}
//else识别失败
// {
// digitalWrite(13,LOW);
// }
while(Serial.read()>0);//清除缓存区
RX_Flag=0;//标志位清零
Num=0;//数据清零
}
}
}
我优化了一下的,大家拿去做项目也简单
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(Read_ID());
delay(1000);
}
long Read_ID() //RFID读卡模块 调取函数返回卡号
{
int flag=0,RX_Flag=0,i;
char Code;
long Num=0;
for(i=0;(Serial.available()>0);i++)
{
char temp=Serial.read();
delay(2);
if(temp==0X02)
{
flag=1;
i=0;
RX_Flag=0;
}
if(flag==1)
{
if(temp==0X03)
{
flag=0;
if(i==13)
{
RX_Flag=1;
}
else
{
RX_Flag=0;
}
break;
}
Code=temp;
}
}
flag=0;
if(RX_Flag==1)
{
for(i=5;i<11;i++)
{
Num<<=4;
if(Code>64)
{
Num+=((Code)-55);
}
else
{
Num+=((Code)-48);
}
}
//Serial.println(Num);
while(Serial.read()>0);
RX_Flag=0;
}
return Num;
}
有错请指正,有更好的优化建议欢迎讨论。——日昏昏兮路遥遥
请问为啥在编译器里面Code=temp;这句要报错啊???
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println(Read_ID());
delay(100);
}
long Read_ID() //RFID读卡模块 调取函数返回卡号
{
int flag=0,RX_Flag=0; //串口标志
char Code; //用于存放读到串口数据
long Num=0; //解码数据
int i;
for(i=0;(Serial.available()>0);i++) //串口有数据时>0,条件成立,i++一直循环
{ //本for将读取14字节的原始卡号数据存往Code数组。传出数组和接收完成标志符
char temp=Serial.read(); //Serial.read()从串口缓冲区读取1字节数据,之后移除这1字节数据
delay(2); //等待读取完成
if(temp==0X02) //如果读取到的为接收起始位
{
flag=1; //检测到起始位 接收启始标志 是
i=0; //重置i++循环
RX_Flag=0; //接收完成标志 否
}
if(flag==1) //接收启始标志 是,开始接收数据
{
if(temp==0X03) //检测到结束码
{
flag=0; //接收启始标志 否
if(i==13) //如果结束码是第13位
{
RX_Flag=1; //第13位为结束码,收到数据,接收完成标志 是
}
else //结束码不是第13位,接收有问题
{
RX_Flag=0; //接收完成标志 否
}
break; //完成结束码检测,已将接收启始标志改否,跳出检测结束码语句
}
Code=temp; //将读取到的14字节数据存入数组
}
}
flag=0; //接收启始标志清零,等待下一次刷卡
if(RX_Flag==1) //如果接收完成标志为是
{ //本if将Code数组转化为卡号
for(i=5;i<11;i++) //数据解码,6位字符转为十六进制数,对应十进制卡号
{
Num<<=4;
if(Code>64)
{
Num+=((Code)-55);
}
else
{
Num+=((Code)-48);
}
}
//Serial.println(Num);
while(Serial.read()>0); //清除缓存区
RX_Flag=0; //接收完成标志 清零,等待下一次刷卡
}
return Num;
}
月影似镰 发表于 2017-6-29 15:51
请问为啥在编译器里面Code=temp;这句要报错啊???
可能是玄学问题,我复制到编译器里也报错,但不是这行报错。代码是没看见有错。直接发文本到评论里了,我试过评论里的代码没错,你试试 感谢大神,有用!取走了~
页:
[1]