Я хочу получить номер входящего звонка и сравнить его

Здравствуйте, я хочу получить и сравнить номер входящего звонка, он работает, но не так, как я хочу. Когда я звоню с хорошего номера, он печатает, что я звонил с сохраненного номера, когда номер перестает звонить, мне нужно сделать это при запуске. И else печатается, когда никто не звонит. Как мне это сделать? Вот мой код:

String d = "";
void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial1.println("AT");
  delay(500);
  Serial1.println("AT+CLIP=1");
  delay(1000);
  Serial1.println("AT+CPIN=1439");
}
void loop()
{ 
 d = Serial1.readString();
 if(d.indexOf("xxxxxxxxx") >=0)
   {
 Serial.println("call is from saved number");
    } else {
       Serial.println("call is not from saved number");
      }
}

, 👍0

Обсуждение

Подсказка №1: «readString()» имеет тайм-аут. Что тогда должен делать ваш код? https://www.arduino.cc/en/Serial/ReadString, @Mikael Patel

@MikaelPatel Когда номер будет распознан, я отправлю HTTP POST на свой API., @Johnny

Вам необходимо проверить, что строка получена и не возвращена из-за таймаута. Только когда получена строка с номером вызова, следует проверить действительный номер телефона. Пожалуйста, исправьте логику управления вашим эскизом., @Mikael Patel

Не могли бы вы помочь мне с этим? Я новичок в C, но он мне нужен для сборки моей системы в мобильном приложении., @Johnny

Например, вы можете добавить «if (d.length() == 0) return;» после "d = Serial1.readString();"., @Mikael Patel

Должен ли я добавить его под моими утверждениями «если»?, @Johnny


1 ответ


Лучший ответ:

1

Функция-член класса Arduino Serial readString() имеет встроенный тайм-аут. Функция вернется по таймауту. Период ожидания по умолчанию составляет 1000 мс. Тайм-аут можно установить с помощью setTimeout().

Скетч должен отфильтровывать пустые строки (тайм-аут). Это можно сделать, добавив проверку длины строки. Ниже приведен пример проверки:

void loop()
{ 
  String d = Serial1.readString(); 
  if (d.length() == 0) return;
  Serial.print(d);
  if (d.indexOf("xxxxxxxxx") >= 0) {
    Serial.println(": call is from saved number");
  } 
  else {
    Serial.println(": call is not from saved number");
  }
}

Удачи!

,

Это все еще не работает, @Johnny

Попробуйте выполнить вышеописанное и проверьте вывод на последовательный монитор., @Mikael Patel

Я пробовал, но самая большая проблема заключается в том, что вызов последовательной печати поступает с сохраненного номера после того, как я отказался звонить., @Johnny

Добавьте, пожалуйста, пример вывода на последовательный монитор. Это помогло бы понять проблему., @Mikael Patel

https://imgur.com/a/PKHDP84, @Johnny

Возможно, вы захотите использовать readStringUntil(), если вы хотите захватывать построчно, а не до истечения времени ожидания. https://www.arduino.cc/en/Serial/ReadStringUntil, @Mikael Patel

Строка d = Serial1.readStringUntil(); Я получил следующую ошибку: нет соответствующей функции для вызова HardwareSerial::readStringUntil()', @Johnny

Вам нужно дать персонаж терминатора. Например, «\r», прочтите страницу документации., @Mikael Patel

Я попробую, как только это будет возможно. Если это сработает, я дам ваш ответ «лучший»., @Johnny