如何检查 SIM800L 上的 Arduino 通话是否活跃?
How to check if a call is active on SIM800L for Arduino?
gprsTest.isCallActive(PHONE_NUMBER)
return 总是 0 即使 phone 正在响铃。根据 GPRS_Shield_Arduino.cpp from this library return 0 for ready, 2 for unknown, 3 for ringing, 4 for call in progress. What am I doing wrong? AT commnads are 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)
return 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
好吧,如果您看一下 isCallActive()
函数的代码,您会发现它 return 是一个布尔值(0 或 1)而不是 2、3、4。
实际上 return 这些数字,根据呼叫的状态,是 AT 命令 AT+CPAS
。而且图书馆没有考虑 AT+CPAS
.
的所有 return
isCallActive()
,在实施时,如果 phone 响铃,将 return 1
。
您可以自己编写并解析 return 值。
仔细阅读代码后发现其实我对函数return的理解是错误的。我编辑了我的答案,如果 phone 正在响铃,函数应该 return 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+CIND命令吗?获取调用状态。
示例。
IN+CIND?
-> +CIND: 5,3,1,1,1,0,0
其中5,3,1,1,1,0,0表示已接电话
使用命令AT+CIND?结合 AT+CLCC 获取更多信息
gprsTest.isCallActive(PHONE_NUMBER)
return 总是 0 即使 phone 正在响铃。根据 GPRS_Shield_Arduino.cpp from this library return 0 for ready, 2 for unknown, 3 for ringing, 4 for call in progress. What am I doing wrong? AT commnads are 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)
return 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
好吧,如果您看一下 isCallActive()
函数的代码,您会发现它 return 是一个布尔值(0 或 1)而不是 2、3、4。
实际上 return 这些数字,根据呼叫的状态,是 AT 命令 AT+CPAS
。而且图书馆没有考虑 AT+CPAS
.
isCallActive()
,在实施时,如果 phone 响铃,将 return 1
。
您可以自己编写并解析 return 值。
仔细阅读代码后发现其实我对函数return的理解是错误的。我编辑了我的答案,如果 phone 正在响铃,函数应该 return 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+CIND命令吗?获取调用状态。
示例。
IN+CIND?
-> +CIND: 5,3,1,1,1,0,0
其中5,3,1,1,1,0,0表示已接电话
使用命令AT+CIND?结合 AT+CLCC 获取更多信息