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
答案 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 获取更多信息