Операции со структурой IPAddress
- Войдите на сайт для отправки комментариев
Втр, 23/02/2016 - 15:51
Добрый день!
Начал разбираться с библиотекой Ethernet и, в частности, со структурой IPAddress.
Возник ряд вопросов, на которые пока не смог найти ответа:
1. В одном из примеров предложен следующий способ задания значения:
#define REMOTE_IP 192,168,10,41 IPAddress RAddr(REMOTE_IP);
но мне нужно задавать значения динамически, в процессе исполнения. Как это правильно сделать? Корректно ли обращение вида:
RAddr[0]=192; RAddr[1]=168; RAddr[2]=100; RAddr[3]=1;
2. Нашел метод fromString(), который позволяет передать значение из строки. А как передать значение из четырехбайтового значения, unsigned long, например?
P.S. С языком только разбираюсь, раньше только с Delphi сталкивался.
Спасибо! Не все конструкци понял, но буду разбираться.
Подскажите еще, пожалуйста, как правильно собрать строку для вывода в Serial.
Есть некая исходная строка:
И есть значение, возращаемое функцией:
описанной как
Хочется вывести сначала отметку времени, а потом саму строку. Как правильно собрать все это в одном объекте String? Вызов
выдает пустую строку, хотя в S есть текст. И отдельный вывод gettime тоже нормально выводится.
Попробуйте сначала что попроще, а потом подставляйте своё (может быть gettime возвращает ноль):
Спасибо. Я уже понял, в чем дело было. После подключения очередной библиотеки в Uno банально перестало хватать памяти для объектов. VS об этом явно не предупреждает, а вот ArduinoIDE при попытке скомпилировать - сразу сказало, что памяти может не хватить.
Похоже, что в моем случае преобразование типов String(time.gettime(...)) неумолимо приближает невозможность ее выделения под объект типа String. Может, какой-то более экономный способ есть, кучу всего вывести в Serial без больших затрат памяти?
А кроме Кернигана и Ритчи - что порекомендуете почитать?
Не помню, чтобы они про C++ писали, но, вообще говоря, для мк обычные книги подойдут только отчасти. Желательно не использовать выделение памяти под объекты вообще, а все классы объявить статическими, т.к. никаких ресурсов мк для C++ не хватит. Никаких операторов new и много чего ещё, иначе нужно покупать сразу Mega 2560, но и она не панацея, забить можно очень легко.
Программирование на C++ для встраиваемых систем имеет определённые ограничения и в двух словах их не объяснить. Не могу посоветовать книжки, но могу посоветовать тупо делать эксперименты. Есть одно простое правило - писать на C++ в стиле C, только обёртывать код не в функции, а в статические классы с методами.
Есть ещё одно правило - все постоянные строки должны располагаться во флеш. ОЗУ на них тратить не имеет смысла. Я пока не понял как это устроено в Arduino, у меня есть свой собственный способ, но он не совместим с классами Arduino.
Разница в использовании ОЗУ. Если описать класс и создать его экземпляр, то расходуется ОЗУ под каждый экземпляр и ОЗУ быстро заканчивается. Его не так много в мк, чтобы создавать экземпляры классов. Вместо этого классы используют как удобные обёртки для набора функций.
Если класс описать так:
То вызов метода класса делается таким образом:
При таком способе использования классов ОЗУ не используется. Все методы и поля класса делаются статическими и такой класс как бы и сам является одним единственным экземпляром. Можно описать мк и периферию только используюя статические классы (и шаблоны). При таком способе результирующий код будет мало чем отличаться от аналогичного кода на C, но удобство его использования будет больше.