RC522使用NodeMCU向电脑发送卡号

RC522使用NodeMCU向电脑发送卡号

NodeMCU和RC522接线图
NodeMcu接线图
项目背景:需要使用一台主机接6-8个RC522读卡器模块,鉴于技术太菜,而且串口通讯偶尔会出现丢包现象,没有选用常用的Arduino Uno+RC522,而是使用Esp8266来进行网络通讯。读卡后直接向电脑发送UDP消息。

按图接好线之后,默认已经安装好NodeMCU和RC522的库了。
这是普通的读取IC卡卡号的代码,这份代码只能读取卡号然后将卡号打印至串口。

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         5           // 配置针脚
#define SS_PIN          4
MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;
void setup() {
  Serial.begin(9600); // 设置串口波特率为9600
  SPI.begin();        // SPI开始
  mfrc522.PCD_Init(); // Init MFRC522 card
  Serial.println("test-demo-start");
}


void loop() {
  // 寻找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("没有找到卡");
    return;
  }

  // 选择一张卡
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    Serial.println("没有卡可选");
    return;
  }


  // 显示卡片的详细信息
  Serial.print(F("卡片 UID:"));
  dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.println();
 
  // 检查兼容性
  if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
          &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
          &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("仅仅适合Mifare Classic卡的读写"));
    return;
  }

  MFRC522::StatusCode status;
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("身份验证失败?或者是卡链接失败"));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  //停止 PICC
  mfrc522.PICC_HaltA();
  //停止加密PCD
  mfrc522.PCD_StopCrypto1();
  return;
}

/**
   将字节数组转储为串行的十六进制值
*/
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

关键在于,Serial.print(buffer[i], HEX);这行代码只能在串口监视器上看到,无法获取并使用udp发送。
下面是完整代码

#include <SPI.h>
#include <MFRC522.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#define STASSID "你的wifi账号"
#define STAPSK  "你的wifi密码"

//目标IP
IPAddress targetIP(192, 168, 1, 101);//目标IP
unsigned int targetPort = 20000;      // 本机端口号和目标的端口号

//Rc522配置
#define RST_PIN         5           // 配置针脚
#define SS_PIN          4
MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;
String  Card_UID;

WiFiUDP Udp;

void setup() {
  Serial.begin(9600); // 设置串口波特率为9600
  //初始化读卡器
  SPI.begin();        // SPI开始
  mfrc522.PCD_Init(); // Init MFRC522 card
  Serial.println("test-demo-start");

  //连接Wifi
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  Serial.printf("UDP server on port %d\n", targetPort);
  Udp.begin(targetPort);
}


void loop() {
  // 寻找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    //    Serial.println("没有找到卡");
    return;
  }

  // 选择一张卡
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    Serial.println("没有卡可选");
    return;
  }

  // 发送卡ID至目标设备
  Udp.beginPacket(targetIP, targetPort);
  Card_UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  Udp.write(Card_UID.c_str());//String格式转换为char*
  Udp.endPacket();

  // 检查兼容性
  if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
          &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
          &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("仅仅适合Mifare Classic卡的读写"));
    return;
  }

  MFRC522::StatusCode status;
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("身份验证失败?或者是卡链接失败"));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  //停止 PICC
  mfrc522.PICC_HaltA();
  //停止加密PCD
  mfrc522.PCD_StopCrypto1();
  return;
}

/**
   将字节数组转储为串行的十六进制值
*/
String dump_byte_array(byte *buffer, byte bufferSize) {
  String id;//十进制ID
  for (byte i = 0; i < bufferSize; i++) {
    id += (buffer[i] / 10);
    id += (buffer[i] % 10);
    //itoa(buffer[i],hexID,16);可以转成十六进制
  }
  Serial.println(p);
  return id;
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值