Уважаемые форумчане, нашел вот такой (листинг ниже) код тут . Подскажите каким образом можно оборвать соединение во время дозвона, если абонент не берет трубку в течение 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; } } }
Если метод voiceCall не блокирующий, то в цикле можно смотреть количество прошедших миллисекунд. Если их больше 15000 и статус звонка не равен TALKING, то вешать трубку.
так вот он вроде блокирующий. После набора номера vcs.voiceCall(charbuffer) программа как бы останавливается и ждёт реакции как я понял. Можно только обработать результат дозвонилась она или нет. Код (Text): if (vcs.voiceCall(charbuffer)) { while(vcs.getvoiceCallStatus()==CALLING) {Serial.println("CCCC");}; } Делаю как в коде. Во время звонка в порт должно печататься "СССС" но ничего не происходит ( Цикл внутри как бы начинает крутиться если только пошло соединение. А как попасть в место когда идет дозвон?