Запись через UART в память EEPROM

Использование внешней и внутренней EEPROM, а так-же SD card
Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#1

Сообщение rw6cm » 15.10.2015{, 07:33}

С разделом статей не смог разобраться, решил выложить здесь.

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

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

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

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

Так как EEPROM понимает только байты, нам надо "слово" разделить на "буквы", перевести каждую в байт, и положить в свою ячейку памяти.
Делаем плату «формирования слова».
СпойлерПоказать
4219721.jpg
*********************************
Последний раз редактировалось rw6cm 15.10.2015{, 11:00}, всего редактировалось 1 раз.
Win10-64, FLProg (portable)

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#2

Сообщение rw6cm » 15.10.2015{, 07:39}

Часть2.

Далее идет запись каждого разложенного "слова" в свои ячейки памяти.
СпойлерПоказать
UART-EEPROM-UAR.flp
(236.03 КБ) 95 скачиваний
На этом можно сказать, что "слова" записаны в EEPROM.

Теперь, чтобы их можно было использовать в проекте, нам надо "слова" преобразовать в обратном порядке.
СпойлерПоказать
5095573.jpg
И вот они! Теперь эти два "слова" в виде переменных DATA1 и DATA2, мы можем использовать по назначению.
СпойлерПоказать
6246842.jpg
Видите, все просто как ни когда! :))))

п/с В файле проекта, в плате «условие на запись» добавлены две переменные Ind1 и Ind2, они по сути не нужны, как и выход индексов, с элементов поиск подстроки. Но в элементе "поиск подстроки" - БАГ, после сохранения проекта, отключенный в нем выход снова включается.
Вложения
2483152.jpg
Последний раз редактировалось rw6cm 15.10.2015{, 10:58}, всего редактировалось 1 раз.
Win10-64, FLProg (portable)

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Запись через UART в память EEPROM

#3

Сообщение Max » 15.10.2015{, 22:39}

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

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#4

Сообщение rw6cm » 16.10.2015{, 00:36}

Max, Не нашел ни одного вопроса в вашем посте.
Напишите конкретно:
Что вам надо записать в EEPROM?
Win10-64, FLProg (portable)

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Запись через UART в память EEPROM

#5

Сообщение Max » 16.10.2015{, 06:24}

По большому счету вопрос касается не EEPROM, а вопрос относится к распарсиванию ответа на АТ команду. Наверно, вопрос по первой части Вашего поста.

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

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

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

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

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#6

Сообщение rw6cm » 16.10.2015{, 09:44}

Max писал(а):Как выловить из пакета данных (как в моих примерах) нужные мне символы?
Ответ на каждую АТ команду имеет свой, состоящий из определенной последовательности, пакет данных.
Ключом для записи должна быть сама команда допустим AT+COPS?
Ответ будет иметь пакет, в котором будет только такая последовательность данных «+COPS: [,,[,]] +CME ERROR». Из этого и нужно исходить в создании условий извлечения данных.
Быстрей всего под каждую команду придется писать индивидуальный алгоритм, или искать какую-то хитрую зависимость между данными.
Последний раз редактировалось rw6cm 16.10.2015{, 10:00}, всего редактировалось 1 раз.
Win10-64, FLProg (portable)

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Запись через UART в память EEPROM

#7

Сообщение Max » 16.10.2015{, 10:00}

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

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#8

Сообщение rw6cm » 16.10.2015{, 10:17}

Выложите файлы как вы это пытаетесь сделать.
Вечером посмотрю почему не получается.
Win10-64, FLProg (portable)

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Запись через UART в память EEPROM

#9

Сообщение Max » 16.10.2015{, 10:20}

rw6cm писал(а):Выложите файлы как вы это пытаетесь сделать.Вечером посмотрю почему не получается.
Вечером выложу. Сам на работе.

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Запись через UART в память EEPROM

#10

Сообщение Max » 16.10.2015{, 18:50}

Вот начал разбирать первые команды. Мой файл внизу прикреплен. Далее остановился и данные не сохранял, т.к. все равно не работало...
Для 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
(117.42 КБ) 85 скачиваний
Последний раз редактировалось Max 16.10.2015{, 18:52}, всего редактировалось 1 раз.

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Запись через UART в память EEPROM

#11

Сообщение Max » 16.10.2015{, 20:49}

Да, еще. Как посчитать сколько символов в строке? Вот например здесь:
6659682.jpg
Вот тут: +CSQ: 24,0 далее на следующей строке ОК

Похоже там передаются еще символы, которых не видно в мониторе порта. Как их увидеть и посчитать? Например для типа переменной CHAR или STRING.
Последний раз редактировалось Max 16.10.2015{, 21:26}, всего редактировалось 1 раз.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#12

Сообщение rw6cm » 17.10.2015{, 08:01}

Max, Чтобы не играть в испорченный телефон (у меня нет его:)), модем трогать не будем.
Исходя из вашего файла понял одно:
Есть МЕГА, по нажатию кнопки передает по UART (допустим на УНО) команду AT+CSQ \r
УНка, присылает ответ:
OK
+CSQ: 24,0
OK
Из этого ответа МЕГЕ нужно взять только 24,0
Верно?
Win10-64, FLProg (portable)

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Запись через UART в память EEPROM

#13

Сообщение Max » 17.10.2015{, 09:28}

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. И подобных команд может быть много и они разные и длины строк ответов тоже разные!!!
Там и прием СМС от СВОЕГО номера по ключевому слову (то же надо выловить), или отказать, если невозможно выполнить, и игнорирование сторонних номеров и т.д.

Мне самое главное разобраться, как правильно дербанить строки и выбирать с нее нужные мне данные! Если я это пойму, то остальное дело техники и логики!
Последний раз редактировалось Max 17.10.2015{, 09:35}, всего редактировалось 1 раз.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#14

Сообщение rw6cm » 17.10.2015{, 09:43}

Max писал(а):Мне самое главное разобраться, как правильно дербанить строки и выбирать с нее нужные мне данные! Если я это пойму, то остальное дело техники и логики!
Золотые слова!
Вечерком подумаю над этим.

Ответ находится в другой ТЕМЕ
Последний раз редактировалось rw6cm 18.10.2015{, 02:37}, всего редактировалось 1 раз.
Win10-64, FLProg (portable)

CraCk
Лейтенант
Сообщения: 632
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 10

Запись через UART в память EEPROM

#15

Сообщение CraCk » 18.10.2015{, 14:50}

Практически то что я хотел. При отсутствие строчного дисплея и кнопок управление, появляеться возможность проводить конфигурацию прошивки через UART своего рода меню конфигурации.
Но есть вопрос: можно упросить схему если передаваемые данные на МК будут состоять только из цифр которые будут прописываться как входы разных блоков например таймер, или генератор? Упрощение схемы нужно для уменьшения размера скетча. При двух переменных скетч занимает 25% от всей памяти. А нужно еще как минимум 6 переменных для создания полноценного меню конфигурации.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#16

Сообщение rw6cm » 19.10.2015{, 17:37}

CraCk писал(а):Практически то что я хотел.
Но есть вопрос: можно упросить схему? Если передаваемые данные на МК будут состоять только из цифр. Упрощение схемы нужно для уменьшения размера скетча. При двух переменных скетч занимает 25% от всей памяти. А нужно еще как минимум 6 переменных для создания полноценного меню конфигурации.
Да... Видать с меня никчемный учитель, если после попыток изложить, как это делается, народ хочет тоже самое но в перламутре... Изображение

Что касаемо вопроса памяти, вы ошибаетесь. Не алгоритм с двумя переменными занимает столько места, а используемые библиотеки.
Достаточно на чистый проект кинуть два элемента: принять из UART и отправить на дисплей, и скетч займет 21% от всей памяти.
Так что разница между двумя или десятью переменными будет не значительная.

Касаемо другого вопроса. Можно и упростить и изменить и сделать как душе угодно, но мне было бы интересней, если это предложили бы вы... Изображение
Даю вам еще один вариант для понимания как это делать.
Смотрите, сравнивайте пытайтесь уловить суть.

Проект рассчитан на десять записей через UART в EEPROM от одного до четырехзначного целого числа.
Запись происходит отправкой пакета в виде SxXXXX, где:
S- команда на запись
х- № ячейки, от 0 до 9
ХХХХ- записываемое число.
Чтение происходит отправкой пакета в виде Rx, где:
R- команда на чтение
х- № ячейки, от 0 до 9

Пример: S12015 - запишет 2015 в ячейку №1.
R1 - считает из ячейки №1 число 2015.

п\с В проекте, перед записью, как обычно отключить индексы в плате №2 )))
Вложения
UART-EEPROM-S-R.flp
(529.12 КБ) 91 скачивание
Win10-64, FLProg (portable)

CraCk
Лейтенант
Сообщения: 632
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 10

Запись через UART в память EEPROM

#17

Сообщение CraCk » 20.10.2015{, 22:53}

Мдааа чем дальше в лес, тем больше дров.
rw6cm писал(а):Да... Видать с меня никчемный учитель, если после попыток изложить, как это делается, народ хочет тоже самое но в перламутре...
Думаю что ученик просто с меня плохой. Просто программу использую несколько недель. Создаю простые схемы на лог. элементах. UART и все что с ним связано для меня высший пилотаж. Здесь нужно крутой скил для реализации таких идей. Еще сложно в голове обрабатывать такие сложные схемы.
Смотрю на Ваши примеры и удивляюсь как к такому можно додуматься  Изображение .

С первой схемой практически разобрался, попробовал увеличить количество пременных с 2 до 4. Но почему то две новые переменные не вносятся в EEPROM. Хотя разрешение на запись и байты в EEPROM подаются. Пример прикреплен.

И вопрос по другому примеру. Если количество переменных увеличить больше 10 то тогда для записи или чтения переменных нужно указывать номер ячейки в 2х значном формате? То есть S01,S05,R10.
И еще можно подсказку как создать команду ALL, при которой на ПК отправляются значение все переменные сохраненных в ячейках.

PS
Ни в коем случае не прекращайте выкладывать примеры работы в программе. Изучив немного Ваши роботы у меня появилось хоть какое то представление и понимание в работе с UART.
Вложения
MOD2_UART-EEPRO.flp
(726.43 КБ) 85 скачиваний
Последний раз редактировалось CraCk 20.10.2015{, 22:56}, всего редактировалось 1 раз.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#18

Сообщение rw6cm » 21.10.2015{, 13:24}

CraCk писал(а):С первой схемой практически разобрался, попробовал увеличить количество пременных с 2 до 4. Но почему то две новые переменные не вносятся в EEPROM. Хотя разрешение на запись и байты в EEPROM подаются. Пример прикреплен.
Вечером гляну что не так.
CraCk писал(а):И вопрос по другому примеру. Если количество переменных увеличить больше 10 то тогда для записи или чтения переменных нужно указывать номер ячейки в 2х значном формате? То есть S01,S05,R10.
Не обязательно, можно например лат. алфавит, или буква - цифра, но проще для запоминания наверно цифры. Главное ячейки не забыть "обозвать") точно так же.
CraCk писал(а):И еще можно подсказку как создать команду ALL, при которой на ПК отправляются значение все переменные сохраненных в ячейках.
Варианты могут быть разные. Первый который пришел на ум такой. Достаточно ввести букву А.

п/с Заодно на схеме элементы расположил более логичней для понимания.
Вложения
8728708.flp
(627.17 КБ) 84 скачивания
Последний раз редактировалось rw6cm 21.10.2015{, 13:26}, всего редактировалось 1 раз.
Win10-64, FLProg (portable)

Аватара пользователя
rw6cm
Полковник
Сообщения: 2283
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 334
Имя: Владимир

Запись через UART в память EEPROM

#19

Сообщение rw6cm » 21.10.2015{, 19:39}

CraCk писал(а):С первой схемой практически разобрался, попробовал увеличить количество пременных с 2 до 4. Но почему то две новые переменные не вносятся в EEPROM. Хотя разрешение на запись и байты в EEPROM подаются. Пример прикреплен.
Мдаа… Пока не узнаем все подводные камни проги, шишек не оберемся:)
Когда писал пример, были непонятки , но погрешил на время записи в память.
А теперь понял, что дело в шифровальщике. Он не любит коротких импульсов.
Если при 1-2 входах он еще успевает определиться, то при большем кол. входов уже нет.
В общем, пока так. Появится время, надо будет изучить его работу по подробней.
Вложения
4851097.flp
(839 КБ) 82 скачивания
Win10-64, FLProg (portable)

CraCk
Лейтенант
Сообщения: 632
Зарегистрирован: 10.09.2015{, 21:51}
Репутация: 10

Запись через UART в память EEPROM

#20

Сообщение CraCk » 26.10.2015{, 23:52}

Схемы работают классно Изображение !!!
Есть еще интересный момент. Как направлять например первую часть ячеек памяти от 0 до 5 в первый блок сложение строк, в котором в конце вывода переменной будет прописываться например текст sec, а вторую часть ячеек памяти в другой блок в котором будет прописано уже не sec a min?
Вложения
2468111.jpg
Последний раз редактировалось CraCk 26.10.2015{, 23:54}, всего редактировалось 1 раз.

Ответить

Вернуться в «Устройства памяти»