如何检查SIM800L上的Arduino呼叫是否有效?

时间:2016-07-03 18:18:33

标签: c++ arduino gsm gprs

gprsTest.isCallActive(PHONE_NUMBER)即使电话响了也总是0。根据{{​​3}}从http://docs.sencha.com/extjs/3.4.0/#!/api/Ext.data.XmlStore返回0表示准备就绪,2表示未知,3表示振铃,4表示正在进行通话。我究竟做错了什么? AT commnads是GPRS_Shield_Arduino.cpp

#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

2 个答案:

答案 0 :(得分:2)

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

根据呼叫状态,实际返回这些数字的是AT命令AT+CPAS。图书馆不会考虑AT+CPAS的所有回报。

isCallActive(),如果手机响铃,将会返回1

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

仔细阅读代码后,我发现我实际上错误地认为函数的返回。我编辑了我的答案,如果手机响铃,该功能应该返回1

但是你在如何调用该函数时遇到了严重的问题。

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

当您使用isCallActive

致电PHONE_NUMBER时,就会发生这种情况

尝试正确调用它。

这应该是这样的:

#define MAX_LEN_NUMBER 10 // or whatever the max number is.

....

char numberToCallActive[MAX_LEN_NUMBER] = "";

void setup()
{
  ....
}

void loop()
{
 ...
 isCallActive(numberToCallActive);
 ....
}

然后,您可以使用此变量来检查实际数字振铃是否是您所呼叫的号码。

答案 1 :(得分:0)

是否应该使用 AT+CIND 命令?获取呼叫状态。

示例。

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

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

使用命令 AT+CIND?结合 AT+CLCC 获取更多信息

相关问题