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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6918|回复: 4

RDM6300读卡模块读卡代码优化分享

[复制链接]
发表于 2017-6-10 21:58 | 显示全部楼层 |阅读模式
RDM6300读卡模块8-9块一个,拿来做刷卡门锁模块不错,只是网上的代码挺麻烦的,卖家也表示自己优化代码。所以我发上来我优化的读卡代码,直接调用就可以返回卡号。

RDM6300读卡模块

RDM6300读卡模块
原代码(卖家给的)
[kenrobot_code]long Password1=1111111;//稍后要改为读取到的卡号1
long Password2=2222222;//稍后要改为读取到的卡号2
int flag=0,RX_Flag=0;//串口标志
char Code[14]; //用于存放读到串口数据
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;//数据清零
   }   
  }
}[/kenrobot_code]

我优化了一下的,大家拿去做项目也简单
[kenrobot_code]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[14];
  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;
}

[/kenrobot_code]


有错请指正,有更好的优化建议欢迎讨论。——日昏昏兮路遥遥
发表于 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[14];    //用于存放读到串口数据
  long Num=0;   //解码数据
  int i;
  for(i=0;(Serial.available()>0);i++)   //串口有数据时>0,条件成立,i++一直循环
  {         //本for将读取14字节的原始卡号数据存往Code[14]数组。传出数组和接收完成标志符
    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[i]=temp;   //将读取到的14字节数据存入数组
    }
  }      
  flag=0;    //接收启始标志清零,等待下一次刷卡

  if(RX_Flag==1)    //如果接收完成标志为是
  {         //本if将Code[14]数组转化为卡号
    for(i=5;i<11;i++)   //数据解码,6位字符转为十六进制数,对应十进制卡号
    {
      Num<<=4;
      if(Code[i]>64)
      {
        Num+=((Code[i])-55);
      }
      else
      {
        Num+=((Code[i])-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;这句要报错啊???

可能是玄学问题,我复制到编译器里也报错,但不是这行报错。代码是没看见有错。直接发文本到评论里了,我试过评论里的代码没错,你试试
发表于 2019-8-6 09:14 | 显示全部楼层
感谢大神,有用!取走了~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:48 , Processed in 0.077270 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表