Я хочу получить номер входящего звонка и сравнить его
Здравствуйте, я хочу получить и сравнить номер входящего звонка, он работает, но не так, как я хочу.
Когда я звоню с хорошего номера, он печатает, что я звонил с сохраненного номера, когда номер перестает звонить, мне нужно сделать это при запуске. И 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");
}
}
@Johnny, 👍0
Обсуждение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
- Моделирование Arduino Mega 2560 с GSM модулем с использованием Proteus
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Кнопка двойного состояния Nextion
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Arduino GSM Shield GSM_READY никогда не готов
- Arduino Mega + SIM808 GSM + модуль GPS + программа включается без нажатия кнопки?
- Запуск двух шаговых двигателей с двумя поворотными энкодерами
- SIM800C, CPIN: НЕ ГОТОВ (КОД ОШИБКИ: +CME ОШИБКА: 10)
Подсказка №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