Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151

Оборвать вызов Arduino Duemillanove + SIM900

08.02.2015, 16:25. Показов 4044. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите каким образом можно оборвать соединение во время дозвона, если абонент не берет трубку в течение 15 секунд?

C++
1
2
3
4
if (vcs.voiceCall(charbuffer))
        {      
          while(vcs.getvoiceCallStatus()==CALLING) {Serial.println("CCCC");};  
        }
Во время гудка я так полагаю должны отправляться символы в ком порт. Но они не отправляются. Из этого я делаю вывод что функция блокирующая.
Как я понял метод voiceCall блокирующий. То есть пока он выполняется программа как бы останавливается и ждет пока снимется трубка на другом конце. Как быть? Нашел ещё внешние прерывания, но это не подходит. Спасибо.
P.S. Использую Arduino Duemillanove + Sim900 модем.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2015, 16:25
Ответы с готовыми решениями:

Arduino SIM900 передача данных
Здравствуйте. Есть Mega 2560, SIM900, сервер, принимающий get-запросы, но до него еще далеко. Не понимаю как реализовать передачу...

ARDUINO UNO + SIM900 SHILD
Вопрос знатокам. возможно ли на GSM модуле включить несущую? (не звонок делать, а просто синус на заданной частоте?)...

ARDUINO + GSM SIM900 (лекбес)
ARDUINO + GSM SIM900 (лекбес) Короче скока не спрашивал на форумах так и не получил ответа, видать мало кто в теме и вот решил поделится,...

26
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.02.2015, 17:18
Обычно "положить трубку и завершить звонки, даже входящий" есть общая команда ATH в последовательный порт модема. Для SIM900 это ATH0.

в течение 15 секунд?
отсчитывать время прошедшее с начала подачи команды вызова. Либо через millis() или с отдельного RTC.
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
08.02.2015, 17:28  [ТС]
Про millis() я понял. Просто дело в том, что когда я начал звонок (vcs.voiceCall(charbuffer)) Я уже не могу отсчитывать. Так как это функция, как я понял, останавливает выполнение кода и ждет результата выполнении функции. 1 если дозвонился и 0 если нет. А мне как бы нужно проверить таймер в промежутке между vcs.voiceCall(charbuffer) и концом работы функции. Например вместо Serial.println("CCCC") я проверяю таймер. Но этот цикл начинает крутиться только если взята трубка на другом конце.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.02.2015, 17:57
Я уже не могу отсчитывать
бред. В основном бесконечном цикле делаете засечки через millis(), а в прерывании таймера пусть идет обработка какого там вашего метода из какой-то обертки-либы под дуину, о котором вы считаете все телепатически должны догадаться
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
08.02.2015, 18:03  [ТС]
Либа <GSM.h>. Так loop не крутится когда выполняется voiceCall(charbuffer). Я пробовал в самом начале loop печатать символы в порт. Они не печатаются пока идет вызов. Loop как бы останавливается и не крутится как я понял пока идет voiceCall(charbuffer). Нет?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.02.2015, 18:25
...общайтесь к этой либе через таймер. Пример: в прерывании таймера есть условие-флаг, по которому идет обращение к методу либы, из основного цикла мы управляем этим флагом. Ферштеен?
1
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
08.02.2015, 18:33  [ТС]
Вроде ферштейн. Мне нужно скачать либу с таймером типа этого? Что-то типа отдельного потока получиться должно?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.02.2015, 18:37
Угу.
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
08.02.2015, 18:38  [ТС]
raxp, Спасибо Сейчас попробую что-нибудь сделать)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.02.2015, 18:41
Только не забудьте при входе в условие этот флаг сбросить, чтобы триггер был, а не постоянное обращение к методу.
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
08.02.2015, 21:41  [ТС]
А нельзя в отдельном потоке запустить таймер и когда он наберет 15 секунд отправить команду в основной поток повесить трубку? Ну как-то так.

Добавлено через 2 часа 47 минут
Не получается. Сбрасывать то сбрасывает, но потом не предлагает ввести номер для следующего звонка. Как будто Loop перестает крутиться. Можете глянуть что не так? Мне нужно чтобы или сбрасывал когда 10 секунд не бурут трубку или когда взяли трубку.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 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>
#include "TimerOne.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];
long tmp_time = millis();
void setup()
{
  
  Timer1.initialize(500000);         // initialize timer1, and set a 1/2 second period
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
 
  // 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()
{
  
  //сбрасываем входящий
  if (vcs.getvoiceCallStatus()==IDLE_CALL ) {vcs.hangCall();}
   
  // 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);
        tmp_time = millis();       
        // Если соединились
        if (vcs.voiceCall(charbuffer))
        {
          // Сбросили
          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;
    }
  }
}
 
void callback()
{
  if  ((vcs.getvoiceCallStatus()==CALLING) && (millis()-tmp_time>10000))
{
        
vcs.hangCall();
}
}
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.02.2015, 07:43
...а подумать? Где реализация флагами, о котором горил выше? И почему по-прежнему в основном цикле остались обращения к методам обертки?
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
09.02.2015, 09:29  [ТС]
raxp, а можете скинуть ссылку на подобную тему с флагами или на простом примере показать. Я нашел таймер и понял что он срабатывает вне зависимости от основного цикла с какой-то задержкой, а про флаги не пойму...
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.02.2015, 11:04
...просто глобальная булева переменная, неужели так трудно?
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
09.02.2015, 21:46  [ТС]
raxp, Мне нужно в лупе изменить эту переменную чтобы на неё сработал таймер по условию. В таймере запустить функцию дозвона и остановить таймер?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.02.2015, 22:48
Именно, только таймер останавливать не нужно. Нужно при входе в условие в таймере, сбросить флаг, чтобы таймер продолжал, а метод вызвался однократно.
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
10.02.2015, 10:15  [ТС]
Спасибо. Понял. Попробую.

Добавлено через 11 часов 19 минут
raxp, а подскажите что в этом месте делается?
C++
1
2
3
4
5
    {
      // add the latest character to the message to send:
      if (inChar != '\r')
        remoteNumber += inChar;
    }
Я понял что это значит что-то типа: если в порт пришел символ возврата каретки то нужно склеить номер и возврат каретки. Но я не понимаю о чем говорит этот управляющий символ.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.02.2015, 10:26
...это накопление в строку. Дело в том, что буратина работает при передаче-приеме однобайтно. В коде происходит сравнение принятого байта на не 0х0D (возврат каретки), и если не равно, то в переменную remoteNumber добавляются принятые символы. А принятый 0x0D является признаком конца передачи.
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 151
10.02.2015, 10:32  [ТС]
По одному символу считывается из порта строка с номером телефона, а потом считывается "enter" как бы и это значит что номер считан?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.02.2015, 10:39
..запустите гипертерминал с подключенным модемом-телефоном, проведите те же операции, убедитесь, что именно это и происходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.02.2015, 10:39
Помогаю со студенческими работами здесь

ARDUINO R3 + SIM900 = web client
Вот на таком железе (так нужно, ибо уже приобретено) ...

Arduino + модуль Sim900, попытка записи файла
Здравствуйте. Нашел в сети скетч позволяющий записывать данные с микрофона через плату SIM900 , мне не удаетя загрузить его в ардуино,...

Питание Arduino GSM Shield SIM900 – непонятки.
Шилд вот такой https://ru.otyexpress.som/item/SIM900-G ... 0.0.d84tBj Проблемка такая. При питании через штатный разъём на плате от блока...

Как подключить Arduino Uno и SIM900 GSM Shield
Хочу подключить SIM900 GSM Shield к Arduino Uno. Пробую обычные AT-команды, но нету никакого результата. Помимо SIM900 GSM Shield...

Некорректная отправка СМС через SIM900 в связке с Arduino UNO R3
При включении из EEPROM считываются данные и отправляются по СМС #include &lt;EEPROM.h&gt; #include &lt;GPRS_Shield_Arduino.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru