RDM6300读卡模块读卡代码优化分享-Arduino中文社区 - Powered by Discuz! Archiver

日昏昏兮路遥遥 发表于 2017-6-10 21:58

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;
}




有错请指正,有更好的优化建议欢迎讨论。——日昏昏兮路遥遥

月影似镰 发表于 2017-6-29 15:51

请问为啥在编译器里面Code=temp;这句要报错啊???
   

日昏昏兮路遥遥 发表于 2017-7-1 17:21

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-7-1 17:26

月影似镰 发表于 2017-6-29 15:51
请问为啥在编译器里面Code=temp;这句要报错啊???

可能是玄学问题,我复制到编译器里也报错,但不是这行报错。代码是没看见有错。直接发文本到评论里了,我试过评论里的代码没错,你试试

corered 发表于 2019-8-6 09:14

感谢大神,有用!取走了~
页: [1]
查看完整版本: RDM6300读卡模块读卡代码优化分享