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

gprsTest.isCallActive(PHONE_NUMBER) всегда возвращает 0, даже если телефон звонит. Согласно GPRS_Shield_Arduino.cpp из этого library возвращает 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

person Community    schedule 03.07.2016    source источник


Ответы (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);
 ....
}

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

person Ouss4    schedule 03.07.2016
comment
Вы имеете в виду, что я должен написать свою собственную функцию? Или модифицировать библиотеку? Я не очень хорошо обрабатываю AT-команды, поэтому использую эту библиотеку. - person ; 03.07.2016
comment
Лицензия библиотеки позволяет вам модифицировать ее, если вы захотите. На самом деле здесь не так много работы, вам просто нужно добавить логику для других возвратов AT+CPAS. Если вам это нужно только для тестирования, вы можете напрямую отправить эту команду на свой шилд через Serial Monitor и увидеть результат. - person Ouss4; 03.07.2016
comment
Похоже, что AT+CPAS не возвращает ничего удобного, когда вы звоните. Раскомментируйте строку 414, чтобы убедиться, что код не входит в оператор if. Попробуйте отправить AT+CPAS с последовательного монитора. Когда вы выполняете вызов, откройте Serial Monitor и просто отправьте AT+CPAS, удалите всю часть isCallActive (убедитесь, что выбраны обе NL и CR и правильная скорость передачи данных). - person Ouss4; 04.07.2016
comment
Строка 414 была раскомментирована. - person ; 04.07.2016
comment
Давайте продолжим обсуждение в чате. - person Ouss4; 04.07.2016

Следует ли использовать команду AT+CIND? чтобы получить состояния вызова.

Пример.

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

Где 5,3,1,1,1,0,0 означает, что на вызов ответили.

Используйте команду AT+CIND? совместно с AT+CLCC для получения дополнительной информации

person Ronald Coarite    schedule 26.07.2021