Как оборвать звонок, если нет соединения в течение какого-то времени?

Тема в разделе "Arduino & Shields", создана пользователем mozgunov, 7 фев 2015.

  1. mozgunov

    mozgunov Нуб

    Уважаемые форумчане, нашел вот такой (листинг ниже) код тут .
    Подскажите каким образом можно оборвать соединение во время дозвона, если абонент не берет трубку в течение 15 секунд? Как я понял пока происходит вызов remoteNumber.toCharArray(charbuffer, 20); программа ничего не может делать параллельно (например оборвать звонок по таймеру) так как loop в этот момент не крутится. Подскажите как можно это реализовать. Я нашел ещё вариант через внешние прерывания, но это не подходит.
    Код (Text):
    /*
    Make Voice Call

    This sketch, for the Arduino GSM shield, puts a voice call to
    a remote phone number that you enter through the serial monitor.
    To make it work, open the serial monitor, and when you see the
    READY message, type a phone number. Make sure the serial monitor
    is set to send a just newline when you press return.

    Circuit:
    * GSM shield
    * Voice circuit.
    With no voice circuit the call will send nor receive any sound


    created Mar 2012
    by Javier Zorzano

    This example is in the public domain.
    */

    // libraries
    #include <GSM.h>

    // PIN Number
    #define PINNUMBER ""

    // initialize the library instance
    GSM gsmAccess; // include a 'true' parameter for debug enabled
    GSMVoiceCall vcs;

    String remoteNumber = "";  // the number you will call
    char charbuffer[20];

    void setup()
    {

      // initialize serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }

      Serial.println("Make Voice Call");

      // connection state
      boolean notConnected = true;

      // Start GSM shield
      // If your SIM has PIN, pass it as a parameter of begin() in quotes
      while (notConnected)
      {
        if (gsmAccess.begin(PINNUMBER) == GSM_READY)
          notConnected = false;
        else
        {
          Serial.println("Not connected");
          delay(1000);
        }
      }

      Serial.println("GSM initialized.");
      Serial.println("Enter phone number to call.");

    }

    void loop()
    {

      // add any incoming characters to the String:
      while (Serial.available() > 0)
      {
        char inChar = Serial.read();
        // if it's a newline, that means you should make the call:
        if (inChar == '\n')
        {
          // make sure the phone number is not too long:
          if (remoteNumber.length() < 20)
          {
            // let the user know you're calling:
            Serial.print("Calling to : ");
            Serial.println(remoteNumber);
            Serial.println();

            // Call the remote number
            remoteNumber.toCharArray(charbuffer, 20);


            // Check if the receiving end has picked up the call
            if (vcs.voiceCall(charbuffer))
            {
              Serial.println("Call Established. Enter line to end");
              // Wait for some input from the line
              while (Serial.read() != '\n' && (vcs.getvoiceCallStatus() == TALKING));
              // And hang up
              vcs.hangCall();
            }
            Serial.println("Call Finished");
            remoteNumber = "";
            Serial.println("Enter phone number to call.");
          }
          else
          {
            Serial.println("That's too long for a phone number. I'm forgetting it");
            remoteNumber = "";
          }
        }
        else
        {
          // add the latest character to the message to send:
          if (inChar != '\r')
            remoteNumber += inChar;
        }
      }
    }
     
  2. ANV

    ANV Гуру

    Если метод voiceCall не блокирующий, то в цикле можно смотреть количество прошедших миллисекунд. Если их больше 15000 и статус звонка не равен TALKING, то вешать трубку.
     
  3. mozgunov

    mozgunov Нуб

    так вот он вроде блокирующий. После набора номера vcs.voiceCall(charbuffer) программа как бы останавливается и ждёт реакции как я понял. Можно только обработать результат дозвонилась она или нет.

    Код (Text):
     if (vcs.voiceCall(charbuffer))
            {      
              while(vcs.getvoiceCallStatus()==CALLING) {Serial.println("CCCC");};  
              }
    Делаю как в коде. Во время звонка в порт должно печататься "СССС" но ничего не происходит (
    Цикл внутри как бы начинает крутиться если только пошло соединение. А как попасть в место когда идет дозвон?
     
    Последнее редактирование: 8 фев 2015
  4. mozgunov

    mozgunov Нуб

    Ребят, подскажите, кто-то же пользовался методом voiceCall?