使用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
相关产品推荐
相关产品推荐

