FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Воскресенье, 04.12.2016, 09:13
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: support, Сергей 
Форум » Основной » Обсуждение программы FLProg (Не багтрекер, и не хотелки. Делимся опытом!!) » Запись через UART в память EEPROM (Как записать в EEPROM информацию, что бы ей воспользоваться.)
Запись через UART в память EEPROM
rw6cm
Дата: Четверг, 15.10.2015, 07:33 | Сообщение # 1
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
С разделом статей не смог разобраться, решил выложить здесь.

Многие задаются вопросом:
Как записать в EEPROM информацию, что бы ей потом воспользоваться, а при необходимости удаленно можно было изменять?

Попытаюсь коротко объяснить, как это реализовать в FLProg из того что есть, и работает в версии 1.10

Часть 1.
Наиболее сложно работать со смешанной информацией, когда есть и цифры и буквы и разные символы.
Одним словом – строкой (тип String). Её и будем рассматривать.
И так предположим нам нужно изменять два "слова", из трех символов каждое.
Будем изменять их через UART.
Прежде всего, ардуинке нужно принять, переданную от нас информацию.
Сделаем для нее плату «Прием из UART»



В ней по сути не чего сложного нет .
Берем элемент и выводим с него строковую переменную и сигнал разрешения.

Далее нужно определится, при каких условиях должна происходить запись каждого "слова" в память.
Решили , если в начале "слова" стоит символ @ значит следующие за ним символы будут записываться,
Аналогично для второго "слова" берем символ $.
Создаем алгоритм выполняющий это.



Из этой платы берем сигналы в виде переменных , Sel – выбор "слова", и EN1,EN2, - разрешение записи для каждого "слова".

Так как EEPROM понимает только байты, нам надо "слово" разделить на "буквы", перевести каждую в байт, и положить в свою ячейку памяти.
Делаем плату «формирования слова».



*********************************
Прикрепления: 4219721.jpg(11Kb) · 3156798.jpg(23Kb) · 9437417.jpg(26Kb)


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)

Сообщение отредактировал rw6cm - Четверг, 15.10.2015, 11:00
 
rw6cm Дата: Четверг, 15.10.2015, 07:39 | Сообщение # 2
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Часть2.

Далее идет запись каждого разложенного "слова" в свои ячейки памяти.



На этом можно сказать, что "слова" записаны в EEPROM.

Теперь, чтобы их можно было использовать в проекте, нам надо "слова" преобразовать в обратном порядке.



И вот они! Теперь эти два "слова" в виде переменных DATA1 и DATA2, мы можем использовать по назначению.



Видите, все просто как ни когда! :))))

п/с В файле проекта, в плате «условие на запись» добавлены две переменные Ind1 и Ind2, они по сути не нужны, как и выход индексов, с элементов поиск подстроки. Но в элементе "поиск подстроки" - БАГ, после сохранения проекта, отключенный в нем выход снова включается.
Прикрепления: 2483152.jpg(19Kb) · 6246842.jpg(28Kb) · 5095573.jpg(11Kb) · UART-EEPROM-UAR.flp(236Kb)


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)

Сообщение отредактировал rw6cm - Четверг, 15.10.2015, 10:58
 
Max Дата: Четверг, 15.10.2015, 22:39 | Сообщение # 3
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Очень интересно. А как быть если данные из UART представляют собой такой вид:



Первый ОК, это отзыв на первую команду, а второй пакет начиная с +..........ОК это ответ на вторую команду.
Здесь последняя строка либо ОК, либо ERROR, а еще четко знать что перед ОК и сравнить с эталоном. Например в первом примере надо сравнивать еще цифры 24,0 (а они могут меняться), а если 99,0 или 99,99 то это ошибка.
Вот не удается выловить и применить единый алгоритм для подобных данных...
А данные могут быть разного размера-длины....
Прикрепления: 3384406.jpg(16Kb) · 8310068.jpg(17Kb)


Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Четверг, 15.10.2015, 22:43
 
rw6cm Дата: Пятница, 16.10.2015, 00:36 | Сообщение # 4
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Max, Не нашел ни одного вопроса в вашем посте.
Напишите конкретно:
Что вам надо записать в EEPROM?


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)
 
Max Дата: Пятница, 16.10.2015, 06:24 | Сообщение # 5
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
По большому счету вопрос касается не EEPROM, а вопрос относится к распарсиванию ответа на АТ команду. Наверно, вопрос по первой части Вашего поста.

Мне нужно, как я уже выше писал, записать весь пакет ответа и из этого ответа выделить нужные мне символы, или ряд символов, и сравнить их с эталоном.

В общем вопрос.
Как выловить из пакета данных (как в моих примерах) нужные мне символы?

Я пытался и массивы использовать и строки. Не получается, скорее всего из за недостаточного знания подноготной функций и возможностей, условий применения блоков FLProg, в частности строк и массивов...

А вообще, занимаюсь сопряжением с FLProg  и GSM  модулем Neoway M590. Интерфейс этого модуля это АТ команды. Соответственно получая АТ команды, он отправляет ответы. Хочу реализовать алгоритм общения с этим модулем, так как программный блок в FLProg ждать очень долго.


Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Пятница, 16.10.2015, 09:00
 
rw6cm Дата: Пятница, 16.10.2015, 09:44 | Сообщение # 6
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Цитата Max ()
Как выловить из пакета данных (как в моих примерах) нужные мне символы?

Ответ на каждую АТ команду имеет свой, состоящий из определенной последовательности, пакет данных.
Ключом для записи должна быть сама команда допустим AT+COPS?
Ответ будет иметь пакет, в котором будет только такая последовательность данных «+COPS: [,,[,]] +CME ERROR». Из этого и нужно исходить в создании условий извлечения данных.
Быстрей всего под каждую команду придется писать индивидуальный алгоритм, или искать какую-то хитрую зависимость между данными.


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)

Сообщение отредактировал rw6cm - Пятница, 16.10.2015, 10:00
 
Max Дата: Пятница, 16.10.2015, 10:00 | Сообщение # 7
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Цитата rw6cm ()
Быстрей всего под каждую команду придется писать индивидуальный алгоритм, или искать какую-то хитрую зависимость между данными.

Дело в том, что отправка нужных команд работает отлично из FLProg, вот проблема с приемом и разбором самих ответов. Я понимаю, что надо выхватывать из ответов определенные символы (хотя есть ответы, команды на которые ответ только ОК), но не могу понять, как это сделать в самой программе! У меня сложилось впечатление, что  массивы не работают и строки не сравниваются. Мне удается выловить только первую букву О из ответа ОК, а весь ответ (ведь там может быть разное количество символов!) не удается понять, как это сделать.


Максим (VK - Максим Дунаевский)
 
rw6cm Дата: Пятница, 16.10.2015, 10:17 | Сообщение # 8
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Выложите файлы как вы это пытаетесь сделать.
Вечером посмотрю почему не получается.


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)
 
Max Дата: Пятница, 16.10.2015, 10:20 | Сообщение # 9
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Цитата rw6cm ()
Выложите файлы как вы это пытаетесь сделать.Вечером посмотрю почему не получается.

Вечером выложу. Сам на работе.


Максим (VK - Максим Дунаевский)
 
Max Дата: Пятница, 16.10.2015, 18:50 | Сообщение # 10
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Вот начал разбирать первые команды. Мой файл внизу прикреплен. Далее остановился и данные не сохранял, т.к. все равно не работало...
Для GSM модуля перед его работой надо его подготовить АТ командами т.е. внести настройки. Вот вариант скетча взятый с Амперки Форум Амперки GSM модуль М590.:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);          // RX, TX
int ch = 0;
String val = "";
#define MASTER "+7XXXXXXXXXX"          //укажите  телефон хозяина

void setup()
{
Serial.begin(9600);                  //подключаем порт компьютера
Serial.println("GSM Neoway M590 example");
mySerial.begin(19200);                //подключаем порт модема (при других скоростях не отвечает)
mySerial.println("ATI");              //вывести в терминал иноформацию о модеме
delay(100);
mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
delay(100);
mySerial.println("AT+CLIP=1");        //включаем АОН
delay(100);
mySerial.println("AT+CMGF=1");        //режим кодировки СМС - обычный (для англ.)
delay(100);
mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
delay(100);
mySerial.println("AT+CNMI=2,2");      //отображение смс в терминале
сразу после приема (без этого сообщения молча падают в память)
}

void loop()
{
if (mySerial.available()) {          //есть данные от GSM модуля
delay(200);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
while (mySerial.available()) {      //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(10);
}
Serial.println(val);                    // дублируем сообщение в терминал

//----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и)
if (val.indexOf("+CMT") > -1) {          //если обнаружен СМС
(для определения звонка вместо "+CMT" вписать "RING", трубку он не
берет, но реагировать на факт звонка можно)
if (val.indexOf(MASTER) > -1) {        //если СМС от хозяина
Serial.println("--- MASTER SMS DETECTED ---");
} else {
Serial.println("NO MASTER SMS");
}

//----------------------- поиск кодового слова в СМС (вообще эту
часть надо поместить внутрь предыдущей, но если использовать кодовое
слово не совпадающее с сообщениями модема, то не обязательно)
if (val.indexOf("sendme") > -1) {      // если обнаружено кодовое слово
Serial.println("send you ok");      // сообщаем об этом в терминал (если нужно)
sms("yes sir!", MASTER);            // отвечаем смской
} else {                              // если другое слово или вообще пустое сообщение
Serial.println("no send you");
sms("no sir!", MASTER);
}
val = "";
}
}
}

void sms(String text, String phone)  //процедура отправки СМС
{
Serial.println("SMS send started");
mySerial.println("AT+CMGS=\"" + phone + "\"");
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send complete");
delay(2000);
Прикрепления: Neoway_SMS.flp(117Kb)


Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Пятница, 16.10.2015, 18:52
 
Max Дата: Пятница, 16.10.2015, 20:49 | Сообщение # 11
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Да, еще. Как посчитать сколько символов в строке? Вот например здесь:



Вот тут: +CSQ: 24,0 далее на следующей строке ОК

Похоже там передаются еще символы, которых не видно в мониторе порта. Как их увидеть и посчитать? Например для типа переменной CHAR или STRING.
Прикрепления: 6659682.jpg(16Kb)


Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Пятница, 16.10.2015, 21:26
 
rw6cm Дата: Суббота, 17.10.2015, 08:01 | Сообщение # 12
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Max, Чтобы не играть в испорченный телефон (у меня нет его:)), модем трогать не будем.
Исходя из вашего файла понял одно:
Есть МЕГА, по нажатию кнопки передает по UART (допустим на УНО) команду AT+CSQ \r
УНка, присылает ответ:
OK
+CSQ: 24,0
OK
Из этого ответа МЕГЕ нужно взять только 24,0
Верно?


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)
 
Max Дата: Суббота, 17.10.2015, 09:28 | Сообщение # 13
Гуру
Группа: Проверенные
Сообщений: 482
Награды: 14
Репутация: 4
Статус: Offline
Цитата rw6cm ()
Max, Чтобы не играть в испорченный телефон (у меня нет его:)), модем трогать не будем.Исходя из вашего файла понял одно:
Есть МЕГА, по нажатию кнопки передает по UART (допустим на УНО) команду AT+CSQ \r
УНка, присылает ответ:
OK
+CSQ: 24,0
OK
Из этого ответа МЕГЕ нужно взять только 24,0
Верно?
Да, в принципе верно.
Уточню, там я сначала по нажатию кнопки (в будущем это будет делаться при включении Ардуинки) отправляю команду AT \r получаю ответ ОК (т.е. это первый ОК сверху!) если ОК а не ERROR то дальше посылается AT+CSQ \r в ответ шлется +CSQ: 24,0 (цифры могут быть другими это уровень приема GSM сигнала, соот. он меняется! Самое главное не должно быть 99.0 или 99.99, если так то сигнала нет! ) и далее ОК.
Выловить надо почти всю строку, т.е. +CSQ и что бы значение было не 99.0 или 99.99! далее надо знать что это ОК а не ERROR.

P.S. И подобных команд может быть много и они разные и длины строк ответов тоже разные!!!
Там и прием СМС от СВОЕГО номера по ключевому слову (то же надо выловить), или отказать, если невозможно выполнить, и игнорирование сторонних номеров и т.д.

Мне самое главное разобраться, как правильно дербанить строки и выбирать с нее нужные мне данные! Если я это пойму, то остальное дело техники и логики!


Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Суббота, 17.10.2015, 09:35
 
rw6cm Дата: Суббота, 17.10.2015, 09:43 | Сообщение # 14
Генерал-майор
Группа: Проверенные
Сообщений: 476
Награды: 43
Репутация: 31
Статус: Offline
Цитата Max ()
Мне самое главное разобраться, как правильно дербанить строки и выбирать с нее нужные мне данные! Если я это пойму, то остальное дело техники и логики!

Золотые слова!
Вечерком подумаю над этим.

Ответ находится в другой ТЕМЕ


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)

Сообщение отредактировал rw6cm - Воскресенье, 18.10.2015, 02:37
 
CraCk Дата: Воскресенье, 18.10.2015, 14:50 | Сообщение # 15
Майор
Группа: Проверенные
Сообщений: 180
Награды: 0
Репутация: 1
Статус: Offline
Практически то что я хотел. При отсутствие строчного дисплея и кнопок управление, появляеться возможность проводить конфигурацию прошивки через UART своего рода меню конфигурации.
Но есть вопрос: можно упросить схему если передаваемые данные на МК будут состоять только из цифр которые будут прописываться как входы разных блоков например таймер, или генератор? Упрощение схемы нужно для уменьшения размера скетча. При двух переменных скетч занимает 25% от всей памяти. А нужно еще как минимум 6 переменных для создания полноценного меню конфигурации.
 
Форум » Основной » Обсуждение программы FLProg (Не багтрекер, и не хотелки. Делимся опытом!!) » Запись через UART в память EEPROM (Как записать в EEPROM информацию, что бы ей воспользоваться.)
Страница 1 из 212»
Поиск:

FLProg © 2016
Яндекс.Метрика