Arduino连接SIM900A时如何提取来电号码?现有代码无法实现
提取SIM900A来电号码的解决方案
嘿,我来帮你搞定这个来电号码提取的问题!从你给出的串口输出来看,SIM900A已经正确返回了带来电号码的+CLIP信息,我们只需要在代码里加入解析逻辑就能提取出目标号码。
完整修改代码
#include <SoftwareSerial.h> SoftwareSerial mySerial(7, 8); void setup() { Serial.begin(9600); mySerial.begin(9600); Serial.println("Initializing..."); // 确保SIM900A开启来电显示功能(如果你的模块还没开启的话) mySerial.println("AT+CLIP=1"); delay(1000); // 读取模块的响应,确认设置成功 if (mySerial.available()) { Serial.println(mySerial.readStringUntil('\n')); } } void loop() { // 检查SIM900A串口是否有数据 if (mySerial.available()) { String incomingLine = mySerial.readStringUntil('\n'); Serial.println(incomingLine); // 打印原始数据,方便调试 // 检测是否包含来电信息标识"+CLIP:" if (incomingLine.indexOf("+CLIP:") != -1) { // 找到第一个引号的位置 int firstQuote = incomingLine.indexOf("\""); // 找到最后一个引号的位置 int lastQuote = incomingLine.lastIndexOf("\""); // 提取两个引号之间的号码 String callerNumber = incomingLine.substring(firstQuote + 1, lastQuote); // 输出提取到的号码 Serial.print("提取到的来电号码: "); Serial.println(callerNumber); // 这里可以加入你的号码对比逻辑,比如: // if (callerNumber == "0945000000") { // // 执行你想要的操作 // } } } }
关键逻辑解释
- 监听串口数据:在
loop里通过mySerial.available()检查SIM900A是否发送了数据,用readStringUntil('\n')读取整行内容,避免处理零散的字符片段。 - 识别来电信息:判断读取到的行是否包含
+CLIP:,这是SIM900A来电显示的标识字符串。 - 提取号码:利用字符串的
indexOf和lastIndexOf找到号码前后的引号位置,再用substring截取中间的号码内容。 - 号码对比:提取到号码后,你可以直接用
==和目标号码进行对比,执行对应的操作。
注意事项
如果你的SIM900A之前没有开启来电显示,setup里的AT+CLIP=1命令会帮你开启这个功能,模块返回OK就说明设置成功了。
内容的提问来源于stack exchange,提问作者Kỳ Đoàn Văn
相关产品推荐
相关产品推荐

