gprsTest.isCallActive(PHONE_NUMBER)始终返回0,即使电话正在响铃。根据此GPRS_Shield_Arduino.cpp中的library返回0,表示准备就绪,2表示未知,3表示响铃,4表示正在进行中。我究竟做错了什么? AT的命令是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。如何修改该库或构建自己的函数以检查调用是否处于 Activity 状态(响铃)?

编辑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

最佳答案

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

根据 call 状态,实际上返回这些数字的是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);
 ....
}

然后,您可以使用此变量来检查实际响铃的号码是否是您 call 的号码。

08-16 01:04