RC522使用NodeMCU向电脑发送卡号

RC522使用NodeMCU向电脑发送卡号

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

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

#include 
#include 
#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 
#include 
#include 
#include 

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

你可能感兴趣的:(Arduino挖坑指南,arduino,串口通信)