Arduino - вопрос по языку и SoftwareSerial

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 77
Зарегистрирован: Сб ноя 04, 2017 19:21:12

Сообщение slyubez »

Приветствую всех.

В сети есть известный скетч сопряжения GSM-модема SIM800L и Arduino. Приведу его текст:

Код: Выделить всё

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
  Serial.begin(19200);  //Скорость порта для связи Arduino с компьютером
  Serial.println("Goodnight moon!");
  mySerial.begin(19200);  //Скорость порта для связи Arduino с GSM модулем
  mySerial.println("AT");
}

void loop() {
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}
Этот скетч полностью рабочий. Однако когда я пытаюсь придать ему удобный вид, оборачивая mySerial в класс, компилятор посылает меня подальше.

Код: Выделить всё

#include "Arduino.h"
#include <SoftwareSerial.h>

class GSMController
{
  private:   
   SoftwareSerial mySerial(2, 3);
   ... 
Прошу подсказать, как правильно называется языковая конструкция инициализации mySerial в первом скетче, и как правильно ее инициализировать при обертке в класс. Всем спасибо.

Добавлено after 2 hours 30 minutes 26 seconds:
Пока единственное рабочее решение - статическая переменная, объявление которой вставлено перед объявлением класса-контроллера. Конечно, мне это не нравится, но увы...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15600
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Вы уже создали экземпляр класса,используя имеющуюся библиотеку
SoftwareSerial mySerial(2, 3); // RX, TX
зачем его еще раз "пересоздавать"??
То, что Вы называете
"придать ему удобный вид"
представляет собой простое создание функции, содержащей в своем составе методы уже созданного класса.
Ничего иного тут не требуется.
Только вот необходимо внимательно отслеживать видимость данных во вновь создаваемой "замещающей" функции
(при необходимости передать соответствующие параметры).
Или я чего-то не понял...
К сожалению с самой библиотекой, обеспечивающей работу с GSM не знаком, но там наверняка предусматривается подключение какого-либо режима последовательного обмена (или I2C или SPI или RS232).
:dont_know:
И уж никак не удастся впихерить в раздел private внешние по отношению к самому классу элементы.
Ибо "только члены класса имеют доступ к методам класса"...
:roll:
Реклама
Открыл глаза
Сообщения: 77
Зарегистрирован: Сб ноя 04, 2017 19:21:12

Сообщение slyubez »

[uquote="BOB51",url="/forum/viewtopic.php?p=3497125#p3497125"]Вы уже создали экземпляр класса,используя имеющуюся библиотеку
SoftwareSerial mySerial(2, 3); // RX, TX
зачем его еще раз "пересоздавать"??[/uquote]
Я неверно выразился. Первый скетч - это пример использования, и не более того. Я не планирую его использовать в проекте. А на такую запись во втором скетче компилятор ругается - мол, так низя.
Я просто пытаюсь обернуть работу с GSM в отдельный класс для использования в составе приложения MVC, и именно это для меня удобный вид. Вот только как эту переменную правильно инициализировать внутри класса - не пойму. Мне отнюдь не хочется, чтобы из других частей приложения был доступ к отдельной статической переменной, располагаемой вне класса-контроллера.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

У ATmega и так ресурсов почти нет, а вы еще ООП используете. Видимо вам кажется что МК слишком быстро работает, или у нем очень много памяти и их нужно на что-то потратить.
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1363
Зарегистрирован: Чт апр 04, 2013 22:22:57
Откуда: Белгород, РФ

Сообщение SIM31 »

[uquote="Мурик",url="/forum/viewtopic.php?p=3497176#p3497176"]У ATmega и так ресурсов почти нет, а вы еще ООП используете. Видимо вам кажется что МК слишком быстро работает, или у нем очень много памяти и их нужно на что-то потратить.[/uquote]

Иногда ООП дает выигрыш по ресурсам. Смотря как компилятор отработает. Меги достаточно мощные МК, вот у тинек объекты да, могут не собраться.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15600
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Так внимательно проработайте библиотеку GSM.
А в собственном проекте используйте отдельные функции, включающие в себя функции библиоткеи GSM.
Хотя... даже в этом случае придется внимательно с передачей параметров повозится - ибо одно дело непосредственное применение и совсем иное - запаковка в субфункцию - подпрограмму определенного часто встречаемого в тексте основной программы фрагмента.
Вариант подобного решения вот тут
https://radiokot.ru/forum/viewtopic.php ... 6#p3497356
:dont_know:
Реклама
Открыл глаза
Сообщения: 77
Зарегистрирован: Сб ноя 04, 2017 19:21:12

Сообщение slyubez »

[uquote="Мурик",url="/forum/viewtopic.php?p=3497176#p3497176"]У ATmega и так ресурсов почти нет, а вы еще ООП используете. Видимо вам кажется что МК слишком быстро работает, или у нем очень много памяти и их нужно на что-то потратить.[/uquote]
Ресурсов хватит. Зато ООП позволит этому коду легче читаться и тестироваться, а также повторно использоваться в других проектах.
BOB51 писал(а):Так внимательно проработайте библиотеку GSM.
А в собственном проекте используйте отдельные функции, включающие в себя функции библиоткеи GSM.
Хотя... даже в этом случае придется внимательно с передачей параметров повозится - ибо одно дело непосредственное применение и совсем иное - запаковка в субфункцию - подпрограмму определенного часто встречаемого в тексте основной программы фрагмента.
Вариант подобного решения вот тут
https://radiokot.ru/forum/viewtopic.php ... 6#p3497356
:dont_know:
Спасибо, попробую. Велосипед стал изобретать именно из-за жирности библиотеки GSM и программного последовательного порта. Заодно появилась возможность освоить ряд фич ардуиновского языка, с которыми я ранее не сталкивался.
Друг Кота
Аватара пользователя
Сообщения: 15600
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Осваивать как "примитив-пользователю" не проблема:
это вот основной базис https://www.arduino.cc/reference/en/ (уже под самую последнюю 1.8.7)
Чуток постарее на русском
http://arduino.ru
http://doc.arduino.ua/ru/about/
база по GCC
http://www.nongnu.org/avr-libc/user-manual/index.html
А вот с правилами написания собственных библиотек там весьма смутно написано (как и с некоторыми особенностями правил построения платформ/заготовок). Приходится самостоятельно импровизировать по ходу освоения.
:beer:
Кстати...
Библиотека, ежли ее подключать, добавляется в результирующий код только частью, касающейся общей инициализации и тем, что используется в вызываемых пользователем функциях.
Управление внешними устройствами можно и самому написать - тогда не "громадный универсал" добавляться будет, а только необходимый минимум (помимо прочего определяемый типом выбранного алгоритма).
В "чужих" библиотеках обычно закладывается избыточная универсальность.
8)
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

slyubez писал(а):из-за жирности библиотеки GSM и программного последовательного порта.
А говоритре что ресурсов хватает. :))) Вот использовали бы МК с 2 МБ флеша и 256 КБ ОЗУ и вероятно о жирности библиотеки не задумывались бы. :)
Хотя тогда не понадобится программный последовательный порт, потому что в таких МК обычно их больше пяти аппаратных. :) :)
Открыл глаза
Сообщения: 77
Зарегистрирован: Сб ноя 04, 2017 19:21:12

Сообщение slyubez »

[uquote="Мурик",url="/forum/viewtopic.php?p=3497964#p3497964"]
slyubez писал(а):из-за жирности библиотеки GSM и программного последовательного порта.
А говоритре что ресурсов хватает. :)))[/uquote]
На ООП точно хватит, если не забивать неиспользуемыми фичами.
Друг Кота
Аватара пользователя
Сообщения: 15600
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну адуринки разные для разных задачч бывают.
Помимо 168/328 меги для "всякой мелочевки" есть и пожирнее...
ардуино мега2560 к примеру...
или ардуина дуе (на atmel SAM3X8E ARM Cortex-M3 от атмела)...
я уж не говорю про те, что на STM32 или на интеловских МП собраны...
:roll:
Другое дело, ежли человек решил побаловаться не определив предварительно требуемые ресурсы проекта...
8)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1363
Зарегистрирован: Чт апр 04, 2013 22:22:57
Откуда: Белгород, РФ

Сообщение SIM31 »

Есть еще Arduino Yun с Линуксом на борту. Arduino DUE не такая удобная, нужно ставить дополнения в основную среду, библиотеки на 99% не работают, но основные функции работают превосходно. Опять же минус чудной кристал ARM Atmel, который отдельно не достанешь, если отладил код на Ардуинке, как отладочной плате и хочется свою плату сделать. Если там нужно максимальное быстродействие, нужно в DMA вникать и прочее.
Есть еще вариант использовать STM32 отладочные платы в Arduino среде, нормально всё работает, но сыровато, глючновато, нужно запастись терпение и быть готовым к подводным камням. Хотя может и поправило сообщество фреймворк.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

SIM31 писал(а): нужно в DMA вникать и прочее
В DMA нет ничего сложного. Указываешь откуда, куда и сколько копировать данных. В основном используется совместно с периферией и позволяет отправлять и принимать данные без прерываний и ожидания. :)
SIM31 писал(а):Есть еще вариант использовать STM32 отладочные платы в Arduino среде
Если не использовать ArduinoIDE, все работает замечательно и без глюков (если в проге не на делать ошибок). А в случае ArduinoIDE нужно еще искать и исправлять ошибки в библиотеках. И в добавок аппаратная отладка не поддерживается. Так что подводный камень (грабли) это ардуина. :)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1363
Зарегистрирован: Чт апр 04, 2013 22:22:57
Откуда: Белгород, РФ

Сообщение SIM31 »

[uquote="Мурик",url="/forum/viewtopic.php?p=3498161#p3498161"]Так что подводный камень (грабли) это ардуина. :)[/uquote]

Это фреймворк универсальный, AnalogWrite что для ATmega, что для STM32F4, иногда удобно. Так же иногда удобнее исправить ошибку в библиотеке, чем писать код заново.
Друг Кота
Аватара пользователя
Сообщения: 15600
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Потому и мявчу - используйте адуринку В РАМКАХ РЕФЕРЕНСА, да с собственно изготовленными программками (или "по феншую" - драйверами).
Тогда и проблем поменьше будет и работоспособность получше.
Или полный предварительный анализ программ "сторонних разработчиков".
Самое досадное - практическое отсутствие описания правил подключения собственных прототипов в рамках референса и отсутствие описания дополнительных особенностей в работе со "штатноописанной периферией" в случае, когда работа ведется не с АВР МК - это относительно "внесенных/сторонних разработчиков".
Там есть отличия как в количестве тех же УАРТ , таймеров так и в их возможностях.
Однако отдельной публикации с дополнениями производители обычно не делают, ограничиваясь в лучшем случае примерами собственных библиотек.
Что есть не совсем удобно
(те же платки от wemos или blue pill).
:roll:
Кстати...
Обсасывание косточек ардуиноподобных можно и в моей https://radiokot.ru/forum/viewtopic.php?f=62&t=156720 продолжить...
Ибо похоже помимо интересов "старого ассемблерщика" тема ардуинок у нас на КОТЕ "не очень кошерна", а прыгать между разделами тяжковато...
:beer:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="slyubez",url="/forum/viewtopic.php?p=3496986#p3496986"]Прошу подсказать, как правильно называется языковая конструкция инициализации mySerial в первом скетче, и как правильно ее инициализировать при обертке в класс.[/uquote]
Называется это - обявление объекта, и вызов его конструктора с передачей параметров.
А как правильно инициализировать это как поле класса, лучшим ответом будет - читайте книги по С++. Так, как Вы пытаетесь сделать, делать нельзя. Вызов конструкторов (и любых других методов) необходимо делать только в области других методов класса, т.к. объект ещё не создан (дано только определение класса), а Вы пытаетесь в нём вызвать метод (в данном случае - конструктор).
В общем - читайте книги по языку. А конкретно к ардуинье этот вопрос не имеет никакого отношения.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

Код: Выделить всё

class GSMController
{
public:
	GSMController() : mySerial(2, 3) {}
private:
	SoftwareSerial mySerial;
};
Ответить

Вернуться в «AVR»