Разработка библиотеки
- Войдите на сайт для отправки комментариев
Сб, 31/10/2020 - 20:20
Здравствуйте.
Хочу вынести функции обработки команд оn модуля SIM800 в отдельную библиотеку
#include <SoftwareSerial.h> #include <Sim800L.h> SoftwareSerial SIM800(9,10);// RX, TX void setup() { SIM800.begin(19200); Serial.begin(19200); Serial.println("Zagruzka"); } void loop() { if(SIM800.available()) Sim800L Otvet(SIM800.readString()); }
/* Sim800L.h - Заголовочный файл */ #ifndef _Sim800L_H_ #define _Sim800L_H_ #include <Arduino.h> class Sim800L { public: Sim800L(String Otvet); }; #endif
/* Sim800L.cpp - Файл реализации */ #include "Sim800L.h" Sim800L::Sim800L(String Otvet) { Otvet.trim(); Serial.println("Otvet: "+Otvet); }
Верна ли логика?
Нет. Правильная логика - взять готовую библиотеку, а свое время потратить продуктивно.
Какую готовую? У меня свои функции в библиотеке будут.
Меня интересует логика работы библиотеки, разработка библиотеки
Наверно должно быть так:
SoftwareSerial SimPort(9, 10); // RX, TX
SIM800 mySim(SimPort);
Примитивненько, но работает
http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...
а я по моему по твоей подсказке в допиленный SomeSerial CustomSoftwareSerial обернул, надо было обязательно выставить 8N2 для порта, работает как швейцарские часы, даже на одно прерывание с портом энкодер повесил для экспериментов
ЗЫ Иринка, иди мужу рогалики пеки, основа библиотеки уже есть, даже больше, на сегодня план выполнен )))
Спасибо, Буду разбираться.
Это не к логике, но всё-таки, вместо
пишите
Намного лучше в данном случае.
Спасибо, Буду разбираться.
а даташитом каким на модуль пользуетесь, из подвернувшихся не увидел ничего по работе с компортом, а там он физически полный
Здравствуйте. Проверить работу кода не могу, нет под рукой устройств, поэтому немного теоретических вопросиков.
Скетч
Modem.h
Вопрос первый:
Код Modem.cpp 17 и 25 строки, верное обращение к функции? или Modem::clear_buffer()
Второй вопрос:
Modem.h переменная char _buffers[50]; Вместо значения 50 должна быть переменная.
В private объявлять пустой массив
а в конструкторе устанавливать размер?
Я конечно не спец по C++, но основная функция конструктора именно выделерие памяти и инициализация переменных/объектов.
ЗЫ. Тяжела женская логика, вопроса на понял (
Я прочитала что размер массива должен быть известен до начала выполнения программы
Первый, вопрос - да, верное
Второй вопрос в привате объявляете указатель на массив, а в конструкторе выделяете под массив память
Как делать можно глянуть в этой теме - https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/problemka-s-d...
Я прочитала что размер массива должен быть известен до начала выполнения программы
Всё зависит от задачи и от МК, например :
Если места нет как в avr для крупной обработки, выделяем крошечный буфер байт сто и в нем работаем, типичный пример можете посмотреть библиотеку ethernet 2, там буфер байт 30 и его заполняют и online отправляют.
Другой пример из последнего : ioLibrary от wiznet, там в http server разработчики вообще не парились, через alloc выделяют памяти в размер страницы http,есть у вас пару тройку килобайт, столько и нарисуют.
Так?
Irinka, вопрос: те кто теоретически будут использовать вашу библиотеку должны мозг включать чтоб знать сколько байт долно быть в буфере?
Если делаете для себя то и пропишите жёстко количество.
Ну а если универсальное - то сами должны определить количество.
MAX_BUF_SIZE часто меняться будет? В зависимости от чего?
всё, сгорели котлеты )))
Библиотеку буду использовать только я сама. С размером буфера возник вопрос, только потому что хочу понять как задать размер массива при создании объекта
всё, сгорели котлеты )))
А я то чего, я то ничего. Какие котлеты в 22 часа? (по МСК)
Нет, но хочу знать как задать размер массива при создании объекта
При создании - константой. В рантайме malloc-ом (он же new).
Библиотеку буду использовать только я сама. С размером буфера возник вопрос, только потому что хочу понять как задать размер массива при создании объекта
Всё зависит от логики работы, в примерах выше мне 16 байт хватало на все,. Дело вкуса...
Вот смотрите
В протеусе проект накидала с ардуинкой)
всё, сгорели котлеты )))
А я то чего, я то ничего. Какие котлеты в 22 часа? (по МСК)
я о перпективе...шучу конечно...
Так?
Да
Тогда я получаю
SIM800.counts();
Получаю 40
Получаю 2
Код выше
Строка 04
_buffers = (char *)calloc(max_buf_size, sizeof(char));
Ну как бэ немножко-то думать нужно ))
SIM800.counts();
Получаю 40
Получаю 2
Код выше
Работа с указателями не эквивалентна работе с массивами. Указатель ничего "не знает" о размерности массива, он просто хранит адрес его первого элемента.
_buffers = (char *)calloc(5, sizeof(char));
У меня так и есть, просто поставила размер 5)
А получаю в мониторе
40
2
То есть размер массива у меня задаётся верно?
Если я ставлю размер изначально char _buffers[25] то получаю
25
25
Вам нужно понимать, что когда память выделяется статически через buffers[25], компилятор (!) может учесть эту размерность и правильно ей оперировать, проверяя выход за границы массива, вычисление sizeof и т.п. В случае со всякими *alloc, компилятор в процессе не участвует, так как все уже превращено в инструкции процессора, а *alloc выполняется как и другой пользовательский код. Программисту (!) следует самому озаботиться хранением размерности фрагмента выделенной памяти и проверкой на всякие записи "не туда".
Одним словом - если буфер статичен всегда, не нужно извращаться с указателями, особенно - если пока не понимаете их механики. Задайте размер массива через константу и позвольте компилятору делать то, что он умеет лучше. Всяким там маллокам место в других ситуациях. Например, когда нужно только иногда организовывать такой буфер попеременно используя один и тот же фрагмент памяти то для формирования JSON, который будет отдан в сеть, то для строки вывода на LCD.
Хорошо. Спасибо)
Здравствуйте.
Подскажите
Buttons.h
Buttons.cpp
Если я объявляю в классе bool pressing();
То в Buttons.cpp компилятор ругается на Buttons::pressing() {
prototype for 'int Buttons::pressing()' does not match any in class 'Buttons
Разобралась...
Разобралась...
за 4-ре минуты, похвально...
Ахах, а как же время написания ответа?))) Минусуйте! Максимум 1,7 минуты! XDDD
Скетч
Buttons.h
Buttons.cpp
Задача: отследить изменение состояния кнопки с 1 на 0 плюс дребезг 500 мс
Верна логика? Или намудрила?
дребезг полсекунды - это через край, обычно 50 мс достаточно
что касается логики - могу посоветовать нарисовать блок-схему - так будет наглядно видно, что да как. А по блок-схеме уже и код писать ))
Ахах, а как же время написания ответа?))) Минусуйте! Максимум 1,7 минуты! XDDD
всё таки минута 48 секунд )))
дребезг полсекунды - это через край, обычно 50 мс достаточно
что касается логики - могу посоветовать нарисовать блок-схему - так будет наглядно видно, что да как. А по блок-схеме уже и код писать ))
Больше подходит слово удержание, чем дребезг)
Ахах, а как же время написания ответа?))) Минусуйте! Максимум 1,7 минуты! XDDD
всё таки минута 48 секунд )))
Agree)
дребезг полсекунды - это через край, обычно 50 мс достаточно
что касается логики - могу посоветовать нарисовать блок-схему - так будет наглядно видно, что да как. А по блок-схеме уже и код писать ))
Больше подходит слово удержание, чем дребезг)
Это разные понятия )) Дребезг нужно отсеивать в любом случае
В общем случае нужна одна функция, которая постоянно мониторит состояние кнопки и по изменениям выставляет события/флаги событий. Это если нужно отслеживать разные события кнопки - нажата, отпущена, удерживается и т.д.
Ну тут и получается как антидребезг, поставить время 50 мс
Примерный алгоритм
Как-то так
Если нужно отслеживать еще и удержание кнопки, то алгоритм немного усложняется
Событие удержания будет выдаваться все время, пока кнопка удерживается нажатой. Если нужно однократное событие удержания, то придется заводить еще один флаг - удержания кнопки и выдавать событие только если флаг еще не поднят (и тут же его поднимать). И сбрасывать этот флаг в момент отпускания кнопки ))
В общем, без
поллитрыблок-схемы мозг сломать можно )))Ну тут и получается как антидребезг, поставить время 50 мс
зависит от кнопок, для моих от 70 до 120 миллисекунд
https://github.com/kakmyc-github/kakmyc_btn
И не парюсь уже пару лет. ))