Как преобразовать скетч примера Arduino в полный проект C++?
Я экспериментирую с новым Arduino Leonardo. Я удалил его оригинальный загрузчик и прошил его с помощью примера запоминающего устройства LUFA с добавленными функциями (теперь это прошивка). Сейчас я пытаюсь добавить пример считывателя RFID (чтение/запись) в свою прошивку. Для этого мне нужно преобразовать скетч в код С++. Поэтому я скопировал соответствующий файл заголовка и файл cpp из папки библиотеки (libraries->rfid-master->bla.h,bla.cpp). Но я не понимаю, что делать с файлом .ino в разделе примеров (библиотеки->rfid-master->examples->ReadAndWrite->blabla.ino). Думаю этот код надо скопировать в основной класс моей прошивки. Есть идеи?
@Isuru, 👍4
1 ответ
По сути, *.ino — это *.cpp без заголовков. Так что вы можете
- переименуйте его в *.cpp,
- Если у вас есть какие-либо функции, которые используются до того, как они были определены, предоставьте объявления для каждой функции перед ее первым использованием
#include <Arduino.h>
сверху#include <Wire.h>
, если вы используете Wire и т. д.
и у вас есть "обычный" файл CPP.
Если вы создаете библиотеку таким образом, вы также создаете файл *.h, в котором вы объявляете все экспортированные функции и объекты и # включаете этот файл в свой *.cpp в качестве первой строки (чем вам не нужно/необходимо вперед объявить любую из этих экспортированных функций)
Вы можете взглянуть на https://github.com/arduino/Arduino.git https://github.com/sudar/Arduino-Makefile и https://github.com/ladislas/bare-arduino-project
у Bare Arduino есть 2 проекта, в каждом из которых используется 2 библиотеки, так что вы можете черпать там вдохновение
- Как использовать SPI на Arduino?
- Улучшенное циклическое переключение цветов RGB.
- Как использовать переменные и функции в нескольких файлах .ino
- Как передать нестатический член класса для обратного вызова на платформах avr?
- Конечный автомат C++ / Wpmf-конверсия
- C++ против языка Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
Makefile, на который вы ссылаетесь, выглядит как слегка устаревшая вилка Sudar Muthu [Arduino-Makefile] (https://github.com/sudar/Arduino-Makefile). Почему бы не дать ссылку на оригинал?, @Edgar Bonet
Просто потому, что я сначала нашел Bare-Arduino, на котором использовалась эта версия (а потом пропатчена версией sudar, как я сейчас вижу). В любом случае он может скомпилировать мои файлы с Arduino 1.8.0, так что он может работать как отправная точка. Или оригинальный make-файл Sudars, но в проекте Bare есть хорошие примеры того, как организовать свой проект, что, я думаю, поможет @Isuru с началом. А позже он может мигрировать на другую версию/систему. (Я тоже строю простой над этим, чтобы помочь моим проектам, ничего особенного, но помог мне быстрее разобраться в своих мыслях), @gilhad
Принимая во внимание, что имеет смысл использовать WeAreLeka/Arduino-Makefile как подмодуль ladislas/Bare-Arduino-Project, нет смысла предоставлять прямую ссылку на этот форк, поскольку он не имеет дополнительной ценности по сравнению с оригиналом. Если вы хотите дать прямую ссылку на Arduino-Makefile, вам следует отредактировать свой ответ, чтобы указать ссылку на реальный проект., @Edgar Bonet
Вы забыли о предварительном объявлении функций., @Pharap
@Pharap «для каждой функции, которая используется перед объявлением, напишите ее заголовок перед первым использованием» (ИМХО) именно так ... и функции, используемые после объявления, уже объявлены. Или есть какие-то другие случаи, когда это нужно обычному ino -> cpp?, @gilhad
Файлы @gilhad
.ino
позволяют вам использовать свои собственные функции без их предварительного объявления, а файлы.cpp
— нет, они требуют, чтобы вы объявили функцию до ее использования, иначе компилятор не узнает о ее существовании. [Вот пример] (https://gist.github.com/Pharap/6f08bdf052b9a81f97b969a2f03347fc). Я бы не стал понимать, что «написать заголовок перед первым использованием» означает «вы должны предварительно объявить свои функции перед их использованием», потому что заголовок — это файл определенного типа, и для него не требуется файл заголовка, он просто требует объявление функции., @Pharapзаголовочный файл
отличается отзаголовка функции
. В вашем примере написаноvoid sendMessage(void);
перед использованиемsendMessage
. (и #includes, как я уже упоминал). Никакой другой разницы., @gilhad