"захватить" значение и переопределить константу
- Войдите на сайт для отправки комментариев
Чт, 25/02/2016 - 20:36
Доброго времени суток! помогите пожалуйста нубу реализовать мысль.
только камнями не бросайтесь)
сначала считываем информацию с порта и сохраняем строку в переменную val. Далее если в строке находим #123, то переопределяем константу ST1 некоторым количеством символов, идущими после #1, т.е. 23%c%c%c%c
(Вроде как %c обозначение наличия символа)
#include <SoftwareSerial.h> SoftwareSerial mySerial(7, 8); int ch = 0; String val = ""; #define ST1 "234567" void setup() { mySerial.begin(9600); } void loop() { if (mySerial.available()) { while (mySerial.available()) { ch = mySerial.read(); val += char(ch); delay(10); } if (val.indexOf("#123") > -1) { то 'захватить' несколько символов(включая 23) , следующих за символами #123 и переопределить значение константы определенной в #define } } }
Или это реализовать через EEPROM ?
что-типо:
#include <SoftwareSerial.h> SoftwareSerial mySerial(7, 8); int ch = 0; int st = 234567 String val = ""; void setup() { mySerial.begin(9600); st = EEPROM.read(1); //считываем значение из 1й ячейки } void loop() { if (mySerial.available()) { while (mySerial.available()) { ch = mySerial.read(); val += char(ch); delay(10); } if (val.indexOf("#123") > -1) { то 'захватить' несколько символов(включая 23) , следующих за символами #123; EEPROM.write(1,значение); //записываем новое значение в 1ю ячейку EEPROM } } }
во втором случае забыл
Конечная цель и, собственно, проблема какие?
Если проблема "захватить" часть полученной строки, то курите (для начала) фукцию substring
Если изменить #define ST1 "234567" в процеесе выполнения программы - то ни как.
Если экономить оперативку, и сохранять множество полученных значений в EEPROM через одну переменную, то второй вариант. Но тут нужно полностью описать что хотите получить.
в общем цель: возможность изменить номер телефона "хозяина" СМСкой при присылании спецкода. и что б этот номер не стирался при потере питания/перезагрузке.
как управлять чем либо по смс разобрался. как найти спецкод, дающий команду поменять номер "хозяина", я разобрался.
а как выцепить номер из того, что гсм модуль присылает в порт, пока не очень.
сейчас еще появилась идея. что начиная с Nного символа по Mный символа считать и присвоить переменной. переменную пишем в еепром.
сначала substring покурю...
пс: я правильно расшифровываю? (за топорность извините, про c++ только на башорге читал)
Да, расшифровка верна.
Лучше всетаки с форматом запроса разобраться, дабы не было сюрприза когда с N по M пришло что-то левое.
Ну и в описанном случае, как научитесь выделять номер, то надо будет добавить один цикл для записи номера (побайтово) в EEPROM (это единственный энергонезависимый метотд хранения в пределах микроконтроллера). В простейшем случае, каждая цифра номера будет отдельным char (=байт), и, соответственно, будет храниться в отдельной ячейке EEPROM.
спасибо!
Чуть подправил :)
Не знаю какой GSM модуль используете. С библиотекой или без. В общем, тут уже надо читать конкретную документацию на конкретно ваш модуль и методы работы с ним.
Номер выделил :) но вроде как вы написали что посчетом символов не есть гуд...
добавил
Модуль M590... точно! наверняка можно запросить отдельно номер абонента!
а можно производить сравнение с заранее записанными номерами телефона на сим карту!
наверное надежнее сравнивать с номерами из EEPROM? или с симкарты? с точки зрения удаленного внесения изменений наверное лчше двигаться в сторону EEPROM..
как в анегдоте "столько идей, столько идей"....
подкорректируйте направление плз...
очень хотелось бы что бы цикл FOR работал, но ксожалению я допускаю какие то грубейшие ошибки :(
в цикле пытаюсь изобразить посимвольную запись в ячейки EEPROM
1.Вырезать один символ через субстринг не обязательно читать
2. в 09 точка с запятой.
А вообще, не плохо показывать на что ругается компилятор...
попробывал несколько вариантов...
1)
ошибка (выделена 09) exit status 1
expected unqualified-id before 'char'
2)
ошибка (выделена 09) exit status 1
пс: ошибки я гуглю и гуглопереводю, но толку мало :(
Попробуйте вместо всего этого вот так: EEPROM.put(0, st);
Попробуйте вместо всего этого вот так: EEPROM.put(0, st);
ошибок не выдало) уже радует)
но всеравно непонятно
из еепрома что то не то возвращается.... или может не в той кодировке...
Сорри, не туда ссылку дал, с этим будет проще
Да, похоже так нельзя строки записывать, извините, но на будущее пригодится может, другие фиксированные типы данных, как я понял, можно. И считывать их тоже удобнее. Так-то вот способ записи строки: http://forum.arduino.cc/index.php?topic=347297.0 Но что-то мне кажется не очень удобно в этом случае. Сейчас напишу другой способ.
Выше неплохой способ написали, но все же вот еще один:
Так как в этом способе используется тип unsigned long, то полностью номер не помещается в одну переменную, если номера всегда будут начинаться с 89, то можно сделать так, считывать 9 чисел, а не 11, то есть с 12 до 21,потом писать так:unsigned long num = st.toInt();EEPROM.put(0, num);
А считывать так:unsigned long test;EEPROM.get(0, test);
И где нужно использовать писать "89"+test или "+79"+testТак то можно не создавать новую переменную test, а использовать ту же самую переменную num если она будет в зоне видимости, то есть EEPROM.get(0, num);Оказалось тут еще не учитывается если вдруг будет первая цифра 0, то есть 890, то не будет работать =) В общем ерунда, если только проверять количество цифр, и если не 9, то дополнять слева нулями... =)
Всё-таки добился нормальной работы так:
char num[12];
st.toCharArray(num, 12) ;
EEPROM.put(0, num);
char test[12];
EEPROM.get(0, test);
Jatixo, okta Спасибо огромное! девушка вернулась с работы... придется оттягивать себя за уши от ардуины. вчера хорошо было, все сутки на смене ковырялся...)
okta, Я всё искал эту функцию, но что то она мимо обходила. нашел strchr и пытался импровизацией st.strchr[i] выудить iтый символ строки. А в справочнике языка(http://arduino.ru/Reference) все время жмакал на первый String и даже не замечал что прям сразу под ним еще ссылка с таким же названием :/
Jatixo, На будущее учту твой вариант. да и вообще я билайном не пользуюсь) а, наверное в других в регионах есть 0 в коде оператора... но врятли мне надо будет включить обогреватель на даче (в подмосковье) из например, Владивостока)
Всё подправил, теперь работает на всех операторах =) все-таки так правильнее и универсальнее=)
а, просто значиение более длинное стал фиксировать) не с 8-9Хn-, а с более ранней цифры
блин, а я с самого начала приметил уже как в конце буду восстанавливать посимвольно из eeprom
Так не поместится в unsigned long 429 496 7295, в общем будет работать неправильно так.
Сорри, не туда ссылку дал, с этим будет проще
сделал так как и написали вы. после заливки скетча в монитор вылетает(как обычно) строка GSM tester v1.0, потом пропадает и всё. а на плате непрерывно светится RX
А, не, не пропадает. просто в порт начинает сталься много пустых строк, видимо. только не пойму, почему команды из loop не выводятся
скобки фигурные неправильно расставлены, проверяйте.
else должен относиться ко второму if, а не к первому, как у вас сейчас
сами объясните почему?
потомучто val получало значение внутри if, а не снаружи. и очизается оно в конце внутри if. а поскольку модуль ничего не передавал, перескакивали на else, а там Serial.println(val);
а val пустой, вот и печаталось много много строг... как то так
вся прога:
верно?
пс: скобки убежали пока мучал код...
:) ага
решил не создавать новую тему...
сначала набросал для одной релюшки. всё отлично работало.. потом дописал еще на 3 реле и непонятки.
если раскоментировать нижний кусок, то перестает реагировать на смски. если нет, то нормально работает. не понимаю почему.
пробовал еще через else if (начиная с четвортого if)
и если раскомментировать 62, та же фигня...
опять кусок кода, опять хрень со скобками в видимом куске... не испытывайте тепение...
если раскомментировать 199, то не реагирует (в монитор порта даже --- MASTER SMS DETECTED --- не прилетает) на #a1, а если закомментировать кусок начиная с 70, а не с 77, и раскомментировать 199, то на #а1 есть реакция.
и вот вообще за гранью понимания
если 062 (из 29 поста) заменить на Serial.println("AAAAAAAAAAA"); (пробовал еще например Serial.println("Prishlo SMS");), то та же шляпа. в монитор не прилетает AAAAAAAAAAA и реле не срабатывает...
а с Serial.println("MASTER SMS DETECTED"); срабатывает.... может дело не в коде?
не порядок со скобками. 119 Else относится только к последнему If. если расскоментить 119, то если в смс будет #a1 сработает 063 if и с 070го if уйдет на 119 else. Такую конструкцию лучше строить через SwitchCase
В остальном ХЗ - не должно изменение выводимого текста так влиять на код.
Если закомментировать проверку свой/чужой, то все 4 канала управляются, и на выводимую надпись нормальная реакция.
намекните как еще можно сделать проверку на номер хозяина?
ПС: до этого эксперементировал на UNO, сейчасас пробую на MEGE. все глюки повторяются.
вопрос по switch... что то типо такой конструкции?
Добился максимума.... срабатывает 3канала
сначала выяснил, что цикл востановления статусов пинов из EEPROM изменяет строку мастер (каждый раз поразному), хотя непонимаю как.
заменил цикл на построчную запись.
потом стал по одному раскомментировать куски кода относящиеся к каждому каналу.
в итоге кусок кода относящийся к 4му каналу дает сбой...
сохратил длину сохраняемой в епром части номера мастера, изменил порядковый номера ячеек еепрома относящиеся к записи статусов каналов. всеравно 4й канал гробит всё.
012 поменял на int PinStatus[3];, вроде всё работает....
можете объяснить такой эффект?
мой моск...
Напишу по проблеме озвученой в начале. Не обязательно всю полученную информацию сразу формировать в строку String. Можно её отобразить сначала через:
char rtB1 = Serial.read();