Arduino使用MagStripe库时card.available阻塞导致其他代码无法运行
问题根因
你遇到的阻塞问题来自两方面:
- MagStripe库的
read()方法默认为阻塞设计,检测到有卡信号后会一直等待完整磁道数据,没有超时退出逻辑 - 读卡器插入后卡检测引脚电平异常,无卡状态下也误触发有卡信号,导致程序一直卡在
read()调用中等待不存在的数据
解决方法
1. 软件层面加超时逻辑(最便捷)
修改magcardFunc函数,增加读取超时判断,超时后主动重置库状态避免一直阻塞:
void magcardFunc() { static const byte DATA_BUFFER_LEN = 108; static char magcard[DATA_BUFFER_LEN]; // 超时计时器,超时阈值设为100ms,可根据实际刷卡速度调整 static unsigned long readStartTime = 0; const unsigned long READ_TIMEOUT_MS = 100; // 无卡时直接返回,重置计时 if (!card.available()) { readStartTime = millis(); return; } // 有卡信号但超时未读到数据,重置库状态后返回 if (millis() - readStartTime > READ_TIMEOUT_MS) { card.begin(2); // 重新初始化库清空缓冲区和状态 readStartTime = millis(); return; } short chars = card.read(magcard, DATA_BUFFER_LEN); if (chars < 0) { Serial.print("bad read"); readStartTime = millis(); return; } if (chars != 0) { // 原代码的magcardstr为笔误,修正为读取缓冲区magcard Serial.print(magcard); readStartTime = millis(); } }
2. 硬件层面排查
- 给读卡器的卡检测引脚外接匹配的上拉/下拉电阻,确保无卡时电平稳定,不会误触发有卡状态
- 确认读卡器和开发板共地正常,避免电平漂移导致中断持续被触发
3. 库源码修改(可选)
如果超时方案仍不能满足需求,可直接修改MagStripe库源码,将read()方法的等待逻辑改为非阻塞,无完整数据时直接返回0,完全避免阻塞主循环。
内容的提问来源于stack exchange,提问作者Black Solis
相关产品推荐
相关产品推荐

