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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:01:31