Как проверить, активен ли звонок на SIM800L для Arduino?

gprsTest.isCallActive(PHONE_NUMBER) вернуть всегда 0 даже телефон звонит. В соответствии с GPRS_Shield_Arduino.cpp из этого библиотека вернуть 0 для готовности, 2 для неизвестного, 3 для звонка, 4 для текущего вызова. Что я делаю неправильно? AT комнады Вот .

#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

Решение

Ну, если вы посмотрите код 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);
....
}

Затем вы можете использовать эту переменную, чтобы проверить, действительно ли звонящий номер — это номер, который вы набрали.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]