Определение номера входящего звонка.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Добрый вечер, прошу подсказать. Оборудование UNO+SIM900. Пишу скетч без библиотеки GSM. 

Смысл скетча следующий: 1. Принять звонок, 2. Определить номер, 3. Сбросить вызов.

Проблема на чтении данных номера с SIM900. Не в тот формат читаю? Прошу напрвитиь на путь истинный.

#include <SoftwareSerial.h>
 
//заводим Serial-соединение с GPRS-Shield на 7 и 8 цифровых входах
SoftwareSerial gprsSerial(7, 8);
 
void setup()
{
    Serial.begin (9600);
    // GPRS Shield общается по умолчанию на скорости 19200 бод
    gprsSerial.begin(19200);
}
 
//в строке curStr будем хранить текущую строку, которую передает нам плата
String currStr = ""; 
int updateTime = 0;
 
void loop()
{
    touch();
 
    if (!gprsSerial.available())
        return;
 
    // Считываем очередной символ с платы
    char currSymb = gprsSerial.read();    
 
    if ('\r' == currSymb) { 
        // Получен символ перевода строки, это значит, что текущее
        // сообщение от платы завершено и мы можем на него отреагировать.
        // Если текущая строка - это RING, то значит, нам кто-то звонит
        if (!currStr.compareTo("RING")) {
            //кокетничаем 3 секунды, чтобы дать услышать звонящему гудок
            delay(3000);
            //посылаем команду на поднятие трубки
            gprsSerial.println("AT+CLCC");
            delay (100);
            char number=gprsSerial.read();
            gprsSerial.println("AT+CHUP");
            delay (100);
            Serial.println (number);
                        
        }
        currStr = "";
    } else if (currSymb != '\n') {
        // Дополняем текущую команду новым сиволом
        // При этом игнорируем второй символ в последовательности переноса
        // строки: \r\n
        currStr += String(currSymb);
    }
}
 
/*
 * Функция провоцирует поддержание коммуникации с платой даже если
 * та была перезагружена без перезагрузки Arduino
 */
void touch()
{
    if (millis() >= updateTime) {
        gprsSerial.println("AT");
        updateTime += 5000;
    }  
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Если у Вас включен AT+CLIP=1, то номер звонящего будет в строке, следующей за RING.
Примерно так:

"AT+CLIP=1

OK

type the AT command in hyper terminal press return you should get ok then ring the number and you should see RING
then the next line should read

+CLIP: "NUMBER ""

Вот здесь https://github.com/Makeroni/Arduino-SIM900/blob/master/alarm.ino подходящий кусок в скетче имеется.