Хочу внести своии 5 копеек касаемо баланса. В теме не увидел нормального решения и решил предложить свое. Здесь код получения баланса и отправки его в ответном сообщении(вернне часть, все лишнее я убрал). Иногда баланс мне приходит в виде +CUSD:0,"OCTATOK 123.45 p.",72. "ОСТАТОК" и "р." написаны латиницей. Но чаще баланс приходит вместе с рекламой на русском языке и как писалось выше, формат сообщения меняется на PDU (+CUSD: 0,004F0043005400410054004F004B0020003100350038...). Каждый символ закодирован двумя байтами, причем латинские буквы, цифры и знаки начинаются с 00, а оставшийся байт - это символы таблицы ASCII. Русские буквы начинаются с 04 и они нас не интересуют. Нам необходимо выделить строку с балансом из этого хаоса чисел и преобразовать его в строку. Буфер SofrwareSerial я увеличил до 250. Также под строку из буфера я отвел 250 байт для того, чтобы гарантировано поймать \r для дальнейшей обработки строки. Надеюсь кому-нибудь поможет.
Добрый день, никто не сталкивался при запросе NTP времени (пока юзал www.ntp-servers.net) командой AT+CNTP("AT+CNTP=\"88.147.254.227\",12") - иногда(редко) время синхронизируется неверно, например +4 или +5 часов к моему. Причем синхронизируется через минуту и все нормально. С указанного сайта я использовал ip 1 яруса, перешел на ip 2 яруса - пока не замечал глюков.
P.S. - на 2 ярусе тоже была обнаружена ошибка синхронизации - 07.02.2017 20:50:11(время до синхронизации) | 08.02.2017 01:49:47 (время после синхронизации)
Ни у кого нет мыслей почему так происходит?
Потестирую на www.time.nist.gov - отпишусь позже.
День добрый.
У меня время вообще не хочет синхронизироваться
Не AT+CLTS=1
Не AT+CNTP, выдает + CNTP: 64.
Перепробовал несколько серверов.
Инет работает, данны отправляются, принимаются, а синхронизация с сервером времени не происходит.
а не проще время из GSM сети брать? или нужно ну оочень точное время?
AT+CLTS=1 из сети тоже не берет. Или есть другой способ?
AT+CLTS=1
AT&W
и после перезагруски будет показывать
Дело в операторе. На МТС приходит время сети, на мегафон не приходит. Испробовал 3 симки от Мегафон. Кто-нибудь синхронизировал время с симкой мегафон?
у меня симка мегафон, чуть позже попробую и отпишусь
а не проще время из GSM сети брать? или нужно ну оочень точное время?
AT+CLTS=1 из сети тоже не берет. Или есть другой способ?
AT+CLTS=1
AT&W
и после перезагруски будет показывать
Дело в операторе. На МТС приходит время сети, на мегафон не приходит. Испробовал 3 симки от Мегафон. Кто-нибудь синхронизировал время с симкой мегафон?
у меня симка мегафон, чуть позже попробую и отпишусь
подтверждаю на мегафоне не работает, а на мтс работает на ура и время очень точное.
А как же Вы управляете модулем ,как отправляете СМС?
alfik777 - не могу найти на форуме ваш один пост, вы мне давали пример как смс отправлять, а потом еще один пример после него уже не по смс.. вот его хотел глянуть.. не мог найти..
Подскажите по такому вопросу - когда принимаешь сообщение с помощью АТ команд, приходится использовать переменную (String например) и так как она заполняется в цикле, ее нужно сделать либо глобальной либо static, а это отжирает память на объем входящего СМС. Никак не могу сообразить как считать данные внутри одной функции, чтобы переменная была локальной.
"Ключевое слово static используется для создания переменных, которые будут видны только одной функции. Однако, в отличие от локальных переменных, которые создаются и уничтожаются при каждом вызове функции, переменные static сохраняют свое значение между вызовами."
между вызовами просто сохраняет свое значение и все! и в вашем лупе похоже она не видна, нужно все в леп засунуть, весь код.
alfik777 - не могу найти на форуме ваш один пост, вы мне давали пример как смс отправлять, а потом еще один пример после него уже не по смс.. вот его хотел глянуть.. не мог найти..
"Ключевое слово static используется для создания переменных, которые будут видны только одной функции. Однако, в отличие от локальных переменных, которые создаются и уничтожаются при каждом вызове функции, переменные static сохраняют свое значение между вызовами."
между вызовами просто сохраняет свое значение и все! и в вашем лупе похоже она не видна, нужно все в леп засунуть, весь код.
между вызовами просто сохраняет свое значение и все! - но память не освобождается, верно? как и если бы она была глобальной.
Я хочу реализовать read_buffer_SIM800L так, чтобы вычитать буфер за раз, и тогда переменную currStr можно было объявить как локальную.
Пробывал добавить цикл в read_buffer_SIM800L, но не удачно, возможно нужно добавить что-то еще в условия while
alfik777 - не могу найти на форуме ваш один пост, вы мне давали пример как смс отправлять, а потом еще один пример после него уже не по смс.. вот его хотел глянуть.. не мог найти..
Что-то я не помню ...Может это не я был?:-)
давали пример еще из вашей сигнализации, там в буфер были собраны сообщения для тревожных смс..
не нашел этих сообщений, обыскался. Там вроде очень удачно скомпоновано было, хотел посмотреть, разобраться детальнее.
давали пример еще из вашей сигнализации, там в буфер были собраны сообщения для тревожных смс..
не нашел этих сообщений, обыскался. Там вроде очень удачно скомпоновано было, хотел посмотреть, разобраться детальнее.
Я+удачно скомпоновано?? Не, точно не я:-))) А если серьезно, в том проекте что я делал, сообщения формировались непосредственно в соответсвующих функциях. Да и тревожная только одна смс была, остальные информационные для отправки или конфигурационные входящие. Так что точно не я.
Смотрю пора учится рптимизировать код передачи ат команд на модуль. а то блин жрет столько что под конеч написания всех хотелок в код - можно застрелится. Не помещается в память, режет смс, да и вообще может в итоге очень нестабильно работать. Тем более в интернет уже хочется чтото передавать...
Смотрю пора учится рптимизировать код передачи ат команд на модуль. а то блин жрет столько что под конеч написания всех хотелок в код - можно застрелится. Не помещается в память, режет смс, да и вообще может в итоге очень нестабильно работать. Тем более в интернет уже хочется чтото передавать...
из-за чего жрет? Вам не хвататет 8кб под переменные?
у меня общение с sim800L только по АТ командам: SMS(прием смс), NTP(синхронизация времени), GPRS(отправка на сайт и скачивание с сайта) - могу помочь.
взял переписал инициализацию модема добавив в скетч - const String strAT[] = {"ATE0","AT+CPBR=1","AT+CSCS=\"GSM\"","AT+CLIP=1","AT+CPBS=\"SM\"","AT+IFC=1,1","AT+CMGF=1",
"AT+CNMI=1,2,2,1,0","AT+DDET=1,0,1"}; и естественно вместо АТ команд вписал уже (strAT[1]) и ит.д... вышло +6% !! динамической памяти в сообщении компилятора.
то есть мой первый вариант хавал на 6% динамической памяти меньше! как же так? Как же тогда экономить динамическую память в проце?
смысл в том, чтобы не забивать оперативку одинаковым текстом, а перенести его во флеш, т.е. заменяете часто используемые символы или фразы в шапке скетча, и из них в теле программы составляете текст, тогда оперативка заметно уменьшится, а статическая память немного возрастёт. Во всяком случае у меня это хорошо работало, т.к. много одинакового текста шло в смс и в серийный порт для отладки.
А уменьшить флеш память получится только правильным использованием формата переменных, именно поэтому я почти никогда не использую int. Так же присмотритесь к define#.
Если какие-то куски кода повторяются в программе(например активация каналов), запихните их в отдельный void, это экономит очень много памяти.
взял переписал инициализацию модема добавив в скетч - const String strAT[] = {"ATE0","AT+CPBR=1","AT+CSCS=\"GSM\"","AT+CLIP=1","AT+CPBS=\"SM\"","AT+IFC=1,1","AT+CMGF=1",
"AT+CNMI=1,2,2,1,0","AT+DDET=1,0,1"}; и естественно вместо АТ команд вписал уже (strAT[1]) и ит.д... вышло +6% !! динамической памяти в сообщении компилятора.
то есть мой первый вариант хавал на 6% динамической памяти меньше! как же так? Как же тогда экономить динамическую память в проце?
Сам недавно занимался оптимизацией кода, прочитал внимательно этюды на этом сайте по работе с памятью и переменными.
Если Вы раньше использовали инициализацию модема и команыд были только внутри ф-ии, то память под них выделялась в момент вызова ф-ии и уничтожалась при выходе из нее. А переписав на const String strAT[] память выделилась сразу, так объявлена как глобальная перменная.
испытал на паре переделанных скетчей, люблю я много разных сообщений выводить в сериал или в смс. уменьшить занятость памяти в 3-4 раза! - давно так ничему не удивлялся. И главное все как часы работает, хотя думаю подводные камни таки должны быть, хз.. но пока все как часы.
испытал на паре переделанных скетчей, люблю я много разных сообщений выводить в сериал или в смс. уменьшить занятость памяти в 3-4 раза! - давно так ничему не удивлялся. И главное все как часы работает, хотя думаю подводные камни таки должны быть, хз.. но пока все как часы.
Можно ли использовать данный макрос следующим образом:
наверное нет, ибо он должен записать то, что между кавычками - намертво во флеш.. и оно не меняется. У меня таких неменяющихся вариантов - полно, вот их все и перенес.
Хочу внести своии 5 копеек касаемо баланса. В теме не увидел нормального решения и решил предложить свое. Здесь код получения баланса и отправки его в ответном сообщении(вернне часть, все лишнее я убрал). Иногда баланс мне приходит в виде +CUSD:0,"OCTATOK 123.45 p.",72. "ОСТАТОК" и "р." написаны латиницей. Но чаще баланс приходит вместе с рекламой на русском языке и как писалось выше, формат сообщения меняется на PDU (+CUSD: 0,004F0043005400410054004F004B0020003100350038...). Каждый символ закодирован двумя байтами, причем латинские буквы, цифры и знаки начинаются с 00, а оставшийся байт - это символы таблицы ASCII. Русские буквы начинаются с 04 и они нас не интересуют. Нам необходимо выделить строку с балансом из этого хаоса чисел и преобразовать его в строку. Буфер SofrwareSerial я увеличил до 250. Также под строку из буфера я отвел 250 байт для того, чтобы гарантировано поймать \r для дальнейшей обработки строки. Надеюсь кому-нибудь поможет.
01
//Размер буфера SoftwareSerial необходимо увеличить до 250 байт.
02
//В файле C:\Program Files\arduino IDE\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h в строке
03
//#define _SS_MAX_RX_BUFF 64 // RX buffer size поменять размер с 64 на 250.
04
#include <SoftwareSerial.h>
05
SoftwareSerial serialGSM(7,8);
06
String str=
""
;
07
String substr=
""
;
08
String number;
09
String substr4=
""
;
10
int8_t j,z;
11
char
Char[69];
12
char
Char4[5];
13
int8_t myArray[17];
14
15
void
setup
() {
16
serialGSM.begin(9600);
17
//AT+IFC=1,1; AT+CMGF=1; AT+CLIP=1; AT+CNMI=2,2,0,0,0; AT+CSCS="GSM"; AT+IPR=9600; ATE0 настройки уже в памяти GSM
18
delay(300);
19
str.reserve(250);
//устанавливаем размер строки 250 байт
20
}
21
22
void
loop
() {
23
24
if
(!serialGSM.available())
//ждем, когда появятся данные
25
return
;
26
27
char
symb=serialGSM.read();
28
29
if
(symb==
'\r'
)
//если конец строки
30
{
31
if
(str.startsWith(
"+CMT"
))
//если это СМС
32
{
33
number=str.substring(6,20);
//сохраняем номер для возможного ответного сообщения
34
}
35
36
else
if
(str==
"balance"
)
37
{
38
serialGSM.print(
"AT+CUSD=1,\"*105#\"\r"
);
//Tele2
39
}
40
41
else
if
(str.startsWith(
"+CUSD"
))
42
{
43
if
(str.length()>30)
//если ответ пришел в виде +CUSD: 0,004F0043005400410054004F004B0020003100350038...
44
{
45
z=0;
46
substr=str.substring(str.indexOf(
"004F"
),str.indexOf(
"002004"
));
//выделяем строку с балансом
47
substr.toCharArray(Char,substr.length()+1);
//копируем символы строки в буфер Char
48
for
(j=0; j<substr.length(); j++)
49
{
50
substr4=substr4+Char[j];
51
if
((j+1)%4==0)
//собираем строку из 4-х символов
52
{
53
substr4.toCharArray(Char4,5);
//копируем символы строки в буфер Char4
54
int
result=strtol(Char4,0,16);
//преобразуем строку в шестнадцатиричное число, тем самым отбрасывая два нуля впереди
55
myArray[z]=result;
//сохраняем число в массиве
56
substr4=
""
;
57
z=z+1;
58
}
59
}
60
serialGSM.print(
"AT+CMGS="
+number+
"\r"
);
61
delay(200);
62
for
(z=0; z<substr.length()/4; z++)
63
{
64
serialGSM.write(myArray[z]);
65
}
66
delay(200);
67
serialGSM.println((
char
)26);
68
delay(100);
69
}
70
else
//если ответ пришел в виде +CUSD: 0,"OCTATOK 123.45 p."
71
{
72
substr=str.substring(10,str.indexOf(
".\""
));
73
serialGSM.print(
"AT+CMGS="
+number+
"\r"
);
74
delay(200);
75
serialGSM.print(substr);
76
delay(200);
77
serialGSM.println((
char
)26);
78
delay(100);
79
}
80
}
81
str=
""
;
82
}
83
else
if
(symb!=
'\n'
)
84
{
85
str=str+String(symb);
86
}
87
}
Добрый день, никто не сталкивался при запросе NTP времени (пока юзал www.ntp-servers.net) командой AT+CNTP("AT+CNTP=\"88.147.254.227\",12") - иногда(редко) время синхронизируется неверно, например +4 или +5 часов к моему. Причем синхронизируется через минуту и все нормально. С указанного сайта я использовал ip 1 яруса, перешел на ip 2 яруса - пока не замечал глюков.
P.S. - на 2 ярусе тоже была обнаружена ошибка синхронизации - 07.02.2017 20:50:11(время до синхронизации) | 08.02.2017 01:49:47 (время после синхронизации)
Ни у кого нет мыслей почему так происходит?
Потестирую на www.time.nist.gov - отпишусь позже.
День добрый.
У меня время вообще не хочет синхронизироваться
Не AT+CLTS=1
Не AT+CNTP, выдает + CNTP: 64.
Перепробовал несколько серверов.
Инет работает, данны отправляются, принимаются, а синхронизация с сервером времени не происходит.
В чем может быть проблема?
команда AT+CNTP синхронизации с сервером врмени.
AT+CNTP ="сервер времени", time zone
покажите код синхронизации и настройки сервера NTP, у вас sim800l?
а не проще время из GSM сети брать? или нужно ну оочень точное время?
а не проще время из GSM сети брать? или нужно ну оочень точное время?
AT+CLTS=1 из сети тоже не берет.
Или есть другой способ?
а не проще время из GSM сети брать? или нужно ну оочень точное время?
у меня данные передаются на сервер по GPRS, почему и не получать время в раз сутки по NTP
а не проще время из GSM сети брать? или нужно ну оочень точное время?
AT+CLTS=1
AT&W
и после перезагруски будет показывать
а не проще время из GSM сети брать? или нужно ну оочень точное время?
https://forums.adafruit.com/viewtopic.php?f=19&t=58002#p294235
а не проще время из GSM сети брать? или нужно ну оочень точное время?
AT+CLTS=1
AT&W
и после перезагруски будет показывать
Дело в операторе.
На МТС приходит время сети, на мегафон не приходит.
Испробовал 3 симки от Мегафон.
Кто-нибудь синхронизировал время с симкой мегафон?
а не проще время из GSM сети брать? или нужно ну оочень точное время?
AT+CLTS=1
AT&W
и после перезагруски будет показывать
у меня симка мегафон, чуть позже попробую и отпишусь
Как вариант: посылаеш себе смс и получив, берёш время
Как вариант: посылаеш себе смс и получив, берёш время
именно это я и имел ввиду.. и можно раз несколкьо часов синхронизировать, или чаще, и не обязательно смс слать, вроде в USSD тоже показывает?
Как вариант: посылаеш себе смс и получив, берёш время
Всё же хотелось бы разобраться с синхронизацией по серверу времени.
AT+CNTP.
Но почему-то ответ +CNTP: 64
а не проще время из GSM сети брать? или нужно ну оочень точное время?
AT+CLTS=1
AT&W
и после перезагруски будет показывать
у меня симка мегафон, чуть позже попробую и отпишусь
подтверждаю на мегафоне не работает, а на мтс работает на ура и время очень точное.
Как бы мегафон победить, без отправок СМС?
01
// NTP
02
Serial3.println(
"AT+CNTPCID=1"
);
03
delay(100);
04
Serial3.println(
"AT+CNTP=\"216.229.0.179\",12"
);
// <a href="http://www.time.nist.gov" title="www.time.nist.gov" rel="nofollow">www.time.nist.gov</a> 216.229.0.179 88.147.254.227
05
delay(100);
06
07
Serial3.println(
"AT+CNTP"
);
08
delay(100);
09
10
Serial3.println(
"AT+CCLK?"
);
11
delay(100);
energokom В такой последоватльности у тебя?
Модуль часов стоит 40 рублей.. Точности хватит лет на 10.
Я себе вот такой купил: https://ru.aliexpress.com/item/DS3231-AT24C32-IIC-Module-Precision-Clock-Module-DS3231SN-for-Arduino-Memory-module-Free-Shipping/32418233172.html?spm=2114.13010708.0.0.Bp65BU
Модуль часов стоит 40 рублей.. Точности хватит лет на 10.
Я себе вот такой купил: https://ru.aliexpress.com/item/DS3231-AT24C32-IIC-Module-Precision-Clock-Module-DS3231SN-for-Arduino-Memory-module-Free-Shipping/32418233172.html?spm=2114.13010708.0.0.Bp65BU
а у меня вот такой шилд https://ru.aliexpress.com/item/Data-logger-shield-for-Arduino-MicroSD-card-RTC-Assembled/32530882474.html, и на нем к сожалению DS1307 - и синхронизация необходима.
я тоже набрал DS1307, а оно дерьмо... не советую, если кто не бра еще, то DS1307 точно не берите.
на просторах али - кто-нибудь встречал шилды не DS1307?
на просторах али - кто-нибудь встречал шилды не DS1307?
пост 467
на просторах али - кто-нибудь встречал шилды не DS1307?
пост 467
разве это шилд?
вот это шилд с RTC и SD на борту https://ru.aliexpress.com/item/Data-logger-shield-for-Arduino-MicroSD-card-RTC-Assembled/32530882474.html
01
// NTP
02
Serial3.println(
"AT+CNTPCID=1"
);
03
delay(100);
04
Serial3.println(
"AT+CNTP=\"216.229.0.179\",12"
);
// <a href="http://www.time.nist.gov" title="www.time.nist.gov" rel="nofollow">www.time.nist.gov</a> 216.229.0.179 88.147.254.227
05
delay(100);
06
07
Serial3.println(
"AT+CNTP"
);
08
delay(100);
09
10
Serial3.println(
"AT+CCLK?"
);
11
delay(100);
energokom В такой последоватльности у тебя?
Да, только я прям в мониторе порта тестирую.
Предворительно подключаюсь к GPRS.
а знаете я тоже такую ошибку кажется получал, GPRS был активным (диод мигает часто), а на балансе было 0 рублей и получал или 61 или 64 ответ.
покажите ответы на каждую команду
01
// NTP
02
Serial3.println(
"AT+CNTPCID=1"
);
03
delay(100);
04
Serial3.println(
"AT+CNTP=\"216.229.0.179\",12"
);
// <a href="http://www.time.nist.gov" title="www.time.nist.gov" rel="nofollow">www.time.nist.gov</a> 216.229.0.179 88.147.254.227
05
delay(100);
06
07
Serial3.println(
"AT+CNTP"
);
08
delay(100);
09
10
Serial3.println(
"AT+CCLK?"
);
11
delay(100);
energokom В такой последоватльности у тебя?
проверил, в терминалке у меня этот код работает
кстати, вот вам еще один способ вытянуть у сим800 время из "интернета"
AT+CIPGSMLOC=2,1
ответ
+CIPGSMLOC: 0,2017/02/26,18:28:45
Блин.. надо будет подкинуть идею программмистам а симкоме - для сим800 сделать в команде параметр AT+CIPGSMLOC=?
AT команды я вообще не использую.
А как же Вы управляете модулем ,как отправляете СМС?
alfik777 - не могу найти на форуме ваш один пост, вы мне давали пример как смс отправлять, а потом еще один пример после него уже не по смс.. вот его хотел глянуть.. не мог найти..
Подскажите по такому вопросу - когда принимаешь сообщение с помощью АТ команд, приходится использовать переменную (String например) и так как она заполняется в цикле, ее нужно сделать либо глобальной либо static, а это отжирает память на объем входящего СМС. Никак не могу сообразить как считать данные внутри одной функции, чтобы переменная была локальной.
небольшой пример ниже.
01
void
read_buffer_SIM800L(){
02
03
static
boolean isStringMessage =
false
;
04
static
String currStr =
""
;
05
static
String currStr_head_at =
""
;
06
07
if
(!Serial3.available())
08
return
;
09
10
char
currSymb = Serial3.read();
11
if
(
'\r'
== currSymb) {
12
if
(isStringMessage) {
13
//если текущая строка - SMS-сообщение или график с сайта,
14
//отреагируем на него соответствующим образом
15
isStringMessage =
false
;
16
// что-то делаем
17
18
}
else
{
19
20
if
(currStr.startsWith(
"+CMT"
)) {
21
//если текущая строка начинается с "+CMT",
22
//то следующая строка является сообщением
23
isStringMessage =
true
;
24
currStr_head_at = currStr;
25
26
}
27
}
28
29
currStr =
""
;
30
31
}
else
if
(
'\n'
!= currSymb) {
32
currStr += String(currSymb);
33
}
34
35
}
36
37
38
void
loop
() {
39
40
// вычитываем буфер
41
read_buffer_SIM800L();
42
}
Спасибо.
что значит либо глоабльн либо статик??
"Ключевое слово static используется для создания переменных, которые будут видны только одной функции. Однако, в отличие от локальных переменных, которые создаются и уничтожаются при каждом вызове функции, переменные static сохраняют свое значение между вызовами."
между вызовами просто сохраняет свое значение и все! и в вашем лупе похоже она не видна, нужно все в леп засунуть, весь код.
делл
alfik777 - не могу найти на форуме ваш один пост, вы мне давали пример как смс отправлять, а потом еще один пример после него уже не по смс.. вот его хотел глянуть.. не мог найти..
что значит либо глоабльн либо статик??
"Ключевое слово static используется для создания переменных, которые будут видны только одной функции. Однако, в отличие от локальных переменных, которые создаются и уничтожаются при каждом вызове функции, переменные static сохраняют свое значение между вызовами."
между вызовами просто сохраняет свое значение и все! и в вашем лупе похоже она не видна, нужно все в леп засунуть, весь код.
между вызовами просто сохраняет свое значение и все! - но память не освобождается, верно? как и если бы она была глобальной.
Я хочу реализовать read_buffer_SIM800L так, чтобы вычитать буфер за раз, и тогда переменную currStr можно было объявить как локальную.
Пробывал добавить цикл в read_buffer_SIM800L, но не удачно, возможно нужно добавить что-то еще в условия while
01
void
read_buffer_SIM800L(){
02
03
/*static*/
boolean isStringMessage =
false
;
04
/*static*/
String currStr =
""
;
05
/*static*/
String currStr_head_at =
""
;
06
07
if
(!Serial3.available())
08
return
;
09
10
while
(Serial3.available()) {
// ПРОБУЮ Вычитать за раз
11
char
currSymb = Serial3.read();
12
if
(
'\r'
== currSymb) {
13
if
(isStringMessage) {
14
//если текущая строка - SMS-сообщение или график с сайта,
15
//отреагируем на него соответствующим образом
16
isStringMessage =
false
;
17
// что-то делаем
18
19
}
else
{
20
21
if
(currStr.startsWith(
"+CMT"
)) {
22
//если текущая строка начинается с "+CMT",
23
//то следующая строка является сообщением
24
isStringMessage =
true
;
25
currStr_head_at = currStr;
26
27
}
28
}
29
30
currStr =
""
;
31
32
}
else
if
(
'\n'
!= currSymb) {
33
currStr += String(currSymb);
34
}
35
}
36
}
между вызовами просто сохраняет свое значение и все! - но память не освобождается, верно? как и если бы она была глобальной.
так она видна толкьо внутри вашего рид-буфера, а в лупе насколько я понимаю - неа..
alfik777 - не могу найти на форуме ваш один пост, вы мне давали пример как смс отправлять, а потом еще один пример после него уже не по смс.. вот его хотел глянуть.. не мог найти..
давали пример еще из вашей сигнализации, там в буфер были собраны сообщения для тревожных смс..
не нашел этих сообщений, обыскался. Там вроде очень удачно скомпоновано было, хотел посмотреть, разобраться детальнее.
между вызовами просто сохраняет свое значение и все! - но память не освобождается, верно? как и если бы она была глобальной.
так она видна толкьо внутри вашего рид-буфера, а в лупе насколько я понимаю - неа..
мне в loop это переменная и не нужна, в строке 17 // что-то делаем
я вызовую функцию и передам в нее значение вот так. И переменная больше не нужна. А так она отожрала память на размер входящего СМС.
1
listen_sms(currStr_head_at, currStr);
2
3
void
listen_sms(
const
String & head_at,
const
String & data_sms)
общий вид.
01
void
listen_sms(
const
String & head_at,
const
String & data_sms) {
02
03
// получили СМС
04
}
05
06
void
read_buffer_SIM800L(){
07
08
/*static*/
boolean isStringMessage =
false
;
09
/*static*/
String currStr =
""
;
10
/*static*/
String currStr_head_at =
""
;
11
12
if
(!Serial3.available())
13
return
;
14
15
while
(Serial3.available()) {
16
char
currSymb = Serial3.read();
17
if
(
'\r'
== currSymb) {
18
if
(isStringMessage) {
19
//если текущая строка - SMS-сообщение или график с сайта,
20
//отреагируем на него соответствующим образом
21
isStringMessage =
false
;
22
// что-то делаем
23
listen_sms(currStr_head_at, currStr);
24
25
}
else
{
26
27
if
(currStr.startsWith(
"+CMT"
)) {
28
//если текущая строка начинается с "+CMT",
29
//то следующая строка является сообщением
30
isStringMessage =
true
;
31
currStr_head_at = currStr;
32
33
}
34
}
35
36
currStr =
""
;
37
38
}
else
if
(
'\n'
!= currSymb) {
39
currStr += String(currSymb);
40
}
41
}
42
}
43
44
45
void
loop
() {
46
47
// вычитываем буфер
48
read_buffer_SIM800L();
49
}
Проблему решил, забыл добавить delay(10) при чтении из буфера.
01
void
listen_sms(
const
String & head_at,
const
String & data_sms) {
02
03
// получили СМС
04
}
05
06
void
read_buffer_SIM800L(){
07
08
/*static*/
boolean isStringMessage =
false
;
09
/*static*/
String currStr =
""
;
10
/*static*/
String currStr_head_at =
""
;
11
12
if
(!Serial3.available())
13
return
;
14
15
while
(Serial3.available()) {
16
char
currSymb = Serial3.read();
17
if
(
'\r'
== currSymb) {
18
if
(isStringMessage) {
19
//если текущая строка - SMS-сообщение или график с сайта,
20
//отреагируем на него соответствующим образом
21
isStringMessage =
false
;
22
// что-то делаем
23
listen_sms(currStr_head_at, currStr);
24
25
}
else
{
26
27
if
(currStr.startsWith(
"+CMT"
)) {
28
//если текущая строка начинается с "+CMT",
29
//то следующая строка является сообщением
30
isStringMessage =
true
;
31
currStr_head_at = currStr;
32
33
}
34
}
35
36
currStr =
""
;
37
38
}
else
if
(
'\n'
!= currSymb) {
39
currStr += String(currSymb);
40
}
41
delay(10);
// Тут добавил
42
43
}
44
45
}
46
47
48
void
loop
() {
49
50
// вычитываем буфер
51
read_buffer_SIM800L();
52
}
давали пример еще из вашей сигнализации, там в буфер были собраны сообщения для тревожных смс..
не нашел этих сообщений, обыскался. Там вроде очень удачно скомпоновано было, хотел посмотреть, разобраться детальнее.
Я+удачно скомпоновано?? Не, точно не я:-))) А если серьезно, в том проекте что я делал, сообщения формировались непосредственно в соответсвующих функциях. Да и тревожная только одна смс была, остальные информационные для отправки или конфигурационные входящие. Так что точно не я.
Может и кто другой.. давно было блин.
Смотрю пора учится рптимизировать код передачи ат команд на модуль. а то блин жрет столько что под конеч написания всех хотелок в код - можно застрелится. Не помещается в память, режет смс, да и вообще может в итоге очень нестабильно работать. Тем более в интернет уже хочется чтото передавать...
Я прилично сократил код, когда начал формировать смски таким образом(тут только пример, но смысл ясен):
01
const
String str[] = {
" "
,
":"
,
"---"
,
"!"
,
"ALARM"
,
"ON"
,
"OFF"
,
"SMS"
};
02
03
void
setup
()
04
{
05
Serial
.begin(9600);
06
Serial
.println(str[4] + str[0] + str[5] + str[3] + str[3] + str[3]);
07
delay(500);
08
Serial
.println(str[2] + str[0] + str[7] + str[1] + str[0] + str[2]);
09
delay(500);
10
Serial
.println(str[4] + str[0] + str[6] + str[3] + str[3] + str[3]);
11
}
12
13
void
loop
(){}
Надеюсь, поможет.
Может и кто другой.. давно было блин.
Смотрю пора учится рптимизировать код передачи ат команд на модуль. а то блин жрет столько что под конеч написания всех хотелок в код - можно застрелится. Не помещается в память, режет смс, да и вообще может в итоге очень нестабильно работать. Тем более в интернет уже хочется чтото передавать...
из-за чего жрет? Вам не хвататет 8кб под переменные?
у меня общение с sim800L только по АТ командам: SMS(прием смс), NTP(синхронизация времени), GPRS(отправка на сайт и скачивание с сайта) - могу помочь.
Я прилично сократил код, когда начал формировать смски таким образом(тут только пример, но смысл ясен):
01
const
String str[] = {
" "
,
":"
,
"---"
,
"!"
,
"ALARM"
,
"ON"
,
"OFF"
,
"SMS"
};
02
03
void
setup
()
04
{
05
Serial
.begin(9600);
06
Serial
.println(str[4] + str[0] + str[5] + str[3] + str[3] + str[3]);
07
delay(500);
08
Serial
.println(str[2] + str[0] + str[7] + str[1] + str[0] + str[2]);
09
delay(500);
10
Serial
.println(str[4] + str[0] + str[6] + str[3] + str[3] + str[3]);
11
}
12
13
void
loop
(){}
Надеюсь, поможет.
да, этот вариант очень даже мне нравится. А еще есть примеры? const String str[] сохраняет в флешпамять? str начинается с str[0] ?
взял переписал инициализацию модема добавив в скетч - const String strAT[] = {"ATE0","AT+CPBR=1","AT+CSCS=\"GSM\"","AT+CLIP=1","AT+CPBS=\"SM\"","AT+IFC=1,1","AT+CMGF=1",
"AT+CNMI=1,2,2,1,0","AT+DDET=1,0,1"}; и естественно вместо АТ команд вписал уже (strAT[1]) и ит.д... вышло +6% !! динамической памяти в сообщении компилятора.
то есть мой первый вариант хавал на 6% динамической памяти меньше! как же так? Как же тогда экономить динамическую память в проце?
попробуйте так:
const
String str[] = {
"AT"
,
"+"
,
"="
};
Serial
.println(str[0] + str[1] + "CPBR" + str[2] + "1"); //
"AT+CPBR=1"смысл в том, чтобы не забивать оперативку одинаковым текстом, а перенести его во флеш, т.е. заменяете часто используемые символы или фразы в шапке скетча, и из них в теле программы составляете текст, тогда оперативка заметно уменьшится, а статическая память немного возрастёт. Во всяком случае у меня это хорошо работало, т.к. много одинакового текста шло в смс и в серийный порт для отладки.
А уменьшить флеш память получится только правильным использованием формата переменных, именно поэтому я почти никогда не использую int. Так же присмотритесь к define#.
Если какие-то куски кода повторяются в программе(например активация каналов), запихните их в отдельный void, это экономит очень много памяти.
взял переписал инициализацию модема добавив в скетч - const String strAT[] = {"ATE0","AT+CPBR=1","AT+CSCS=\"GSM\"","AT+CLIP=1","AT+CPBS=\"SM\"","AT+IFC=1,1","AT+CMGF=1",
"AT+CNMI=1,2,2,1,0","AT+DDET=1,0,1"}; и естественно вместо АТ команд вписал уже (strAT[1]) и ит.д... вышло +6% !! динамической памяти в сообщении компилятора.
то есть мой первый вариант хавал на 6% динамической памяти меньше! как же так? Как же тогда экономить динамическую память в проце?
Сам недавно занимался оптимизацией кода, прочитал внимательно этюды на этом сайте по работе с памятью и переменными.
Если Вы раньше использовали инициализацию модема и команыд были только внутри ф-ии, то память под них выделялась в момент вызова ф-ии и уничтожалась при выходе из нее. А переписав на const String strAT[] память выделилась сразу, так объявлена как глобальная перменная.
Конструктор предложения конечно неплохо, но оказывается есть еще интереснее вариант.
Конструктор предложения конечно неплохо, но оказывается есть еще интереснее вариант.
Поделитесь с нами )
http://arduino.ru/forum/obshchii/neoway-m590#comment-267372
испытал на паре переделанных скетчей, люблю я много разных сообщений выводить в сериал или в смс. уменьшить занятость памяти в 3-4 раза! - давно так ничему не удивлялся. И главное все как часы работает, хотя думаю подводные камни таки должны быть, хз.. но пока все как часы.
http://arduino.ru/forum/obshchii/neoway-m590#comment-267372
испытал на паре переделанных скетчей, люблю я много разных сообщений выводить в сериал или в смс. уменьшить занятость памяти в 3-4 раза! - давно так ничему не удивлялся. И главное все как часы работает, хотя думаю подводные камни таки должны быть, хз.. но пока все как часы.
Можно ли использовать данный макрос следующим образом:
1
String str=
"123"
;
2
Serial
.println(F(str));
3
//или
4
Serial
.println(F(str +
"qwerty"
));
У меня получилось только так -
1
Serial
.println(F(
"123"
));
наверное нет, ибо он должен записать то, что между кавычками - намертво во флеш.. и оно не меняется. У меня таких неменяющихся вариантов - полно, вот их все и перенес.