You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RC522读取Mifare卡区块后与指定文本对比的实现疑问

我来帮你解决这个问题,你之前的写法犯了一个典型的错误——把字符的ASCII值直接相加,这完全不是字符串拼接,所以肯定没法和"Rhyton"对比成功。下面给你两种可行的解决方案,适配Arduino的场景:

方法1:转为String类型处理(简单直观)

先把RC522返回的readbackblock数组转换成String,之后就能轻松做前缀对比或者字符串拆分了:

// 将readbackblock的有效字符转为String(自动忽略末尾的空字符)
String cardContent = String((char*)readbackblock);

// 方案A:直接检查前缀是否为"Rhyton"
if (cardContent.startsWith("Rhyton")) {
  digitalWrite(7, HIGH);
  digitalWrite(6, LOW); // 记得关闭另一个引脚避免冲突
} else {
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
}

// 方案B:按"User"拆分字符串后对比前缀
int splitPos = cardContent.indexOf("User");
if (splitPos != -1) {
  String prefix = cardContent.substring(0, splitPos);
  if (prefix == "Rhyton") {
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
  } else {
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
  }
} else {
  // 未找到"User"分隔符的异常处理
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
}

方法2:直接用char数组对比(更节省内存)

考虑到Arduino的RAM资源有限,使用String可能会产生内存碎片化问题,更推荐直接操作char数组做逐字符对比:

// 定义要匹配的目标前缀
const char* targetPrefix = "Rhyton";
bool isMatch = true;

// 逐字符对比前6个字符("Rhyton"的长度为6)
for (int i = 0; i < 6; i++) {
  if (readbackblock[i] != targetPrefix[i]) {
    isMatch = false;
    break;
  }
}

// 根据匹配结果控制引脚
if (isMatch) {
  digitalWrite(7, HIGH);
  digitalWrite(6, LOW);
} else {
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
}

为什么你之前的写法失败?

你写的char d = readbackblock[0] + readbackblock[1] + ...是把每个字符的ASCII数值(比如'R'是82,'h'是104)直接相加,得到的是一个整数总和(82+104+121+116+111+110=644),再把这个整数赋值给char类型变量,最后和字符串"Rhyton"做对比——这完全是类型不匹配的错误操作,所以必然会走else分支。

内容的提问来源于stack exchange,提问作者Alireza Sabahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:57:06