【问题标题】:How to check if a call is active on SIM800L for Arduino?如何检查 Arduino 的 SIM800L 上的通话是否处于活动状态?
【发布时间】:2016-07-03 18:18:33
【问题描述】:

gprsTest.isCallActive(PHONE_NUMBER) 总是返回 0,即使电话在响。根据 GPRS_Shield_Arduino.cpp 从这个 library 返回 0 表示就绪,2 表示未知,3 表示正在响铃,4 表示正在进行呼叫。我究竟做错了什么? AT commnads 是 here

#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>


#define PIN_TX    7
#define PIN_RX    8
#define BAUDRATE  9600
#define PHONE_NUMBER "003xxxxxxxxxx"
#define MESSAGE  "Temp is high"

GPRS gprsTest(PIN_TX, PIN_RX, BAUDRATE); //RX,TX,BaudRate

void setup() {
  Serial.begin(9600);

  // code 

}

void loop() {

// ..code..


  if (temp>35) {
    call_number();
  }

// ..code..

}

void call_number() {
  Serial.println(gprsTest.isCallActive(PHONE_NUMBER));// return 0 that is ok
  Serial.println("Start to call...");
  gprsTest.callUp(PHONE_NUMBER); // It calls and phone is ringing 
  delay(4000);
  Serial.println(gprsTest.isCallActive(PHONE_NUMBER)); // It return again 0 when phone is ringing

}

编辑 1:在 Ouss4 回答 gprsTest.isCallActive(PHONE_NUMBER) 后返回 0 或 1。如何修改此库或构建自己的函数来检查呼叫是否处于活动状态(响铃)?

编辑2:我改为

char number[15] = "00306912345678";
char numberToCallActive[15] = "00306912345678";
...
setup(){
...

...
}
void call_number(){
  Serial.println(F("Before call"));
  Serial.println(gprsTest.isCallActive(numberToCallActive)); // return 0 , I uncomment Serial.print on cpp to print gprsBuffer
  Serial.println(F("start to call ... "));
  gprsTest.callUp(number);
  Serial.println(F("SUCCESS"));
  Serial.println(F("When phone is ringing"));
  Serial.println(gprsTest.isCallActive(numberToCallActive)); return 0 , I uncomment Serial.print on cpp to print gprsBuffer
  Serial.println(F("Again when phone is ringing"));
  Serial.println(gprsTest.isCallActive(numberToCallActive));return 0 , I uncomment Serial.print on cpp to print gprsBuffer
  Serial.print("\n");
}

输出:

    Before call
    Buffer isCallActive 1: AT+CPAS
    +CPAS: 0

    OK

    0
    start to call ... 
    SUCCESS
    When phone is ringing
    Buffer isCallActive 1: ATD00306912345678;
    AT+CPAS

    0
    Again when phone is ringing
    Buffer isCallActive 1: 
    0

【问题讨论】:

    标签: c++ arduino gsm gprs


    【解决方案1】:

    好吧,如果您看一下 isCallActive() 函数的代码,您会发现它返回一个布尔值(0 或 1)而不是 2、3、4。

    根据调用状态,实际返回这些数字的是 AT 命令AT+CPAS。而且图书馆没有考虑AT+CPAS的所有回报。

    isCallActive(),在实现时,如果电话响铃,将返回1

    您可以自己编写并解析返回值。


    仔细看了代码发现其实是我对函数的返回搞错了。我编辑了答案,如果电话响了,函数应该返回1

    但是,您在如何调用该函数方面遇到了严重的问题。

    该函数也尝试获取该数字并将其存储在您发送的参数中 (isCallActive(char *number)),但是您发送的是 字符串文字,然后是该函数尝试修改它,并且尝试修改字符串文字会导致未定义的行为

    当您使用PHONE_NUMBER 调用isCallActive 时,会发生这种情况

    尝试正确调用它。

    这应该是这样的:

    #define MAX_LEN_NUMBER 10 // or whatever the max number is.
    
    ....
    
    char numberToCallActive[MAX_LEN_NUMBER] = "";
    
    void setup()
    {
      ....
    }
    
    void loop()
    {
     ...
     isCallActive(numberToCallActive);
     ....
    }
    

    然后您可以使用此变量来检查响铃的号码是否真的是您拨打的号码。

    【讨论】:

    • 你的意思是我必须自己写函数?还是要修改库?我不能很好地处理 AT 命令,这就是我使用这个库的原因
    • 库的许可证允许您根据需要进行修改。其实不需要做很多工作,只需要添加 AT+CPAS 其他返回的逻辑即可。如果您只需要测试,您可以直接通过串口监视器将此命令发送到您的盾牌并查看结果。
    • 看起来 AT+CPAS 在你打电话时没有返回任何方便的东西。取消注释第 414 行以确认代码未输入 if 语句。尝试从串口监视器发送 AT+CPAS。当您执行呼叫时打开 Serial Monitor 并发送 AT+CPAS,删除所有 isCallActive 部分(确保选择“Both NL & CR”和正确的波特率)。
    • 第 414 行未注释。
    【解决方案2】:

    你应该使用 AT+CIND 命令吗?获取通话状态。

    示例。

    IN+CIND?
    -> +CIND: 5,3,1,1,1,0,0
    

    其中 5,3,1,1,1,0,0 表示已接听电话。

    使用命令 AT+CIND?结合 AT+CLCC 了解更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2012-12-08
      • 2020-01-11
      • 2019-12-10
      • 2019-03-21
      相关资源
      最近更新 更多