Страница 1 из 1

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

Добавлено: Пт ноя 02, 2018 15:35:14
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:
Пока единственное рабочее решение - статическая переменная, объявление которой вставлено перед объявлением класса-контроллера. Конечно, мне это не нравится, но увы...

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

Добавлено: Пт ноя 02, 2018 18:13:37
BOB51
Вы уже создали экземпляр класса,используя имеющуюся библиотеку
SoftwareSerial mySerial(2, 3); // RX, TX
зачем его еще раз "пересоздавать"??
То, что Вы называете
"придать ему удобный вид"
представляет собой простое создание функции, содержащей в своем составе методы уже созданного класса.
Ничего иного тут не требуется.
Только вот необходимо внимательно отслеживать видимость данных во вновь создаваемой "замещающей" функции
(при необходимости передать соответствующие параметры).
Или я чего-то не понял...
К сожалению с самой библиотекой, обеспечивающей работу с GSM не знаком, но там наверняка предусматривается подключение какого-либо режима последовательного обмена (или I2C или SPI или RS232).
:dont_know:
И уж никак не удастся впихерить в раздел private внешние по отношению к самому классу элементы.
Ибо "только члены класса имеют доступ к методам класса"...
:roll:

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

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

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

Добавлено: Пт ноя 02, 2018 20:02:03
Мурик
У ATmega и так ресурсов почти нет, а вы еще ООП используете. Видимо вам кажется что МК слишком быстро работает, или у нем очень много памяти и их нужно на что-то потратить.

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

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

Иногда ООП дает выигрыш по ресурсам. Смотря как компилятор отработает. Меги достаточно мощные МК, вот у тинек объекты да, могут не собраться.

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

Добавлено: Сб ноя 03, 2018 07:15:36
BOB51
Так внимательно проработайте библиотеку GSM.
А в собственном проекте используйте отдельные функции, включающие в себя функции библиоткеи GSM.
Хотя... даже в этом случае придется внимательно с передачей параметров повозится - ибо одно дело непосредственное применение и совсем иное - запаковка в субфункцию - подпрограмму определенного часто встречаемого в тексте основной программы фрагмента.
Вариант подобного решения вот тут
https://radiokot.ru/forum/viewtopic.php ... 6#p3497356
:dont_know:

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

Добавлено: Сб ноя 03, 2018 20:54:47
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 и программного последовательного порта. Заодно появилась возможность освоить ряд фич ардуиновского языка, с которыми я ранее не сталкивался.

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

Добавлено: Вс ноя 04, 2018 07:34:15
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)

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

Добавлено: Вс ноя 04, 2018 10:36:55
Мурик
slyubez писал(а):из-за жирности библиотеки GSM и программного последовательного порта.
А говоритре что ресурсов хватает. :))) Вот использовали бы МК с 2 МБ флеша и 256 КБ ОЗУ и вероятно о жирности библиотеки не задумывались бы. :)
Хотя тогда не понадобится программный последовательный порт, потому что в таких МК обычно их больше пяти аппаратных. :) :)

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

Добавлено: Вс ноя 04, 2018 10:57:55
slyubez
[uquote="Мурик",url="/forum/viewtopic.php?p=3497964#p3497964"]
slyubez писал(а):из-за жирности библиотеки GSM и программного последовательного порта.
А говоритре что ресурсов хватает. :)))[/uquote]
На ООП точно хватит, если не забивать неиспользуемыми фичами.

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

Добавлено: Вс ноя 04, 2018 12:30:56
BOB51
Ну адуринки разные для разных задачч бывают.
Помимо 168/328 меги для "всякой мелочевки" есть и пожирнее...
ардуино мега2560 к примеру...
или ардуина дуе (на atmel SAM3X8E ARM Cortex-M3 от атмела)...
я уж не говорю про те, что на STM32 или на интеловских МП собраны...
:roll:
Другое дело, ежли человек решил побаловаться не определив предварительно требуемые ресурсы проекта...
8)

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

Добавлено: Вс ноя 04, 2018 17:00:20
SIM31
Есть еще Arduino Yun с Линуксом на борту. Arduino DUE не такая удобная, нужно ставить дополнения в основную среду, библиотеки на 99% не работают, но основные функции работают превосходно. Опять же минус чудной кристал ARM Atmel, который отдельно не достанешь, если отладил код на Ардуинке, как отладочной плате и хочется свою плату сделать. Если там нужно максимальное быстродействие, нужно в DMA вникать и прочее.
Есть еще вариант использовать STM32 отладочные платы в Arduino среде, нормально всё работает, но сыровато, глючновато, нужно запастись терпение и быть готовым к подводным камням. Хотя может и поправило сообщество фреймворк.

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

Добавлено: Вс ноя 04, 2018 17:34:38
Мурик
SIM31 писал(а): нужно в DMA вникать и прочее
В DMA нет ничего сложного. Указываешь откуда, куда и сколько копировать данных. В основном используется совместно с периферией и позволяет отправлять и принимать данные без прерываний и ожидания. :)
SIM31 писал(а):Есть еще вариант использовать STM32 отладочные платы в Arduino среде
Если не использовать ArduinoIDE, все работает замечательно и без глюков (если в проге не на делать ошибок). А в случае ArduinoIDE нужно еще искать и исправлять ошибки в библиотеках. И в добавок аппаратная отладка не поддерживается. Так что подводный камень (грабли) это ардуина. :)

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

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

Это фреймворк универсальный, AnalogWrite что для ATmega, что для STM32F4, иногда удобно. Так же иногда удобнее исправить ошибку в библиотеке, чем писать код заново.

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

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

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

Добавлено: Вт ноя 06, 2018 00:20:37
Аlex
[uquote="slyubez",url="/forum/viewtopic.php?p=3496986#p3496986"]Прошу подсказать, как правильно называется языковая конструкция инициализации mySerial в первом скетче, и как правильно ее инициализировать при обертке в класс.[/uquote]
Называется это - обявление объекта, и вызов его конструктора с передачей параметров.
А как правильно инициализировать это как поле класса, лучшим ответом будет - читайте книги по С++. Так, как Вы пытаетесь сделать, делать нельзя. Вызов конструкторов (и любых других методов) необходимо делать только в области других методов класса, т.к. объект ещё не создан (дано только определение класса), а Вы пытаетесь в нём вызвать метод (в данном случае - конструктор).
В общем - читайте книги по языку. А конкретно к ардуинье этот вопрос не имеет никакого отношения.

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

Добавлено: Вт ноя 06, 2018 00:39:13
Reflector

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

class GSMController
{
public:
	GSMController() : mySerial(2, 3) {}
private:
	SoftwareSerial mySerial;
};