Разделить код Arduino на несколько файлов с помощью Arduino IDE
Я работаю над очень длинным кодом, который требует определения нескольких функций. Я хочу разделить код на два файла: основной код ("Feeder_Control" на скриншоте) и функции ("соединения" на скриншоте) Как импортировать второй файл в основной код, чтобы использовать его функции?
PS: В C/C++ то же самое делается с #include "connections.h". Как это делается в Arduino IDE.
.
@Salitha Indrajith Pathiraja, 👍16
Обсуждение2 ответа
Лучший ответ:
Нет необходимости использовать директиву #include для дополнительного файла .ino.
Перед началом компиляции Arduino IDE объединяет все файлы .ino в вашем скетче в один файл, начиная с файла .ino, который соответствует имени папки sketch, а затем остальные файлы .ino в алфавитном порядке. Таким образом, нет никакой разницы между одним массивным файлом .ino и взломом одного и того же кода среди нескольких файлов .ino, кроме большей простоты навигации по коду с помощью вкладок. После небольшой дополнительной обработки этот файл компилируется как C++.
Ссылка: https://arduino.github.io/arduino-cli/latest/sketch-build-process/#pre-processing
Два комментария для ответа от per1234 (хотя и старые): В проекте может быть несколько файлов .ino. Однако:
- Нельзя отделять часть препроцессора от основного файла (файла с именем проекта), который должен включать ВСЮ предварительную обработку.
- Arduino IDE компилирует все файлы проекта в определенном порядке (в алфавитном порядке по имени файла) и включает их в основной файл .ino на этапе компоновки. Код в более поздних файлах .ino может получать доступ к переменным и функциям, определенным в более ранних файлах, но не наоборот.
Пожалуйста, дайте ссылку на ответ и/или укажите, кто его опубликовал, а не говорите "ответ №1" - порядок ответов меняется со временем и в зависимости от выбранного типа порядка. Пожалуйста, [редактируйте] и обновите свой ответ., @Greenonline
подробности, которые вы упомянули, находятся на связанной странице. per1234 — тестер Arduino CLI в Arduino и основной автор документации Arduino CLI, включая связанную страницу., @Juraj
что там с препроцессором? такого ограничения нет., @Juraj
>Код в более поздних файлах .ino может получать доступ к переменным и функциям, определенным в более ранних, но не наоборот
Это верно для переменных, но не для функций: при объединении всех файлов .ino в один .cpp прототипы функций из всех файлов .ino генерируются и добавляются в начало этого файла .cpp. Если это работает хорошо, все функции можно использовать из любой части кода. И хорошей идеей будет собрать все глобальные переменные в файле projectname.ino, который идет первым в объединении .cpp., @DataFiddler
Спасибо за подробности. Но у меня есть основной файл и в нем большая часть кода вывода HTML (или CSS). Эта часть HTML в настоящее время находится в корне основного файла. Я хочу переместить ее в отдельный файл, но она не определена как функция Arduino, и поэтому у нее нет функции-прототипа, и она не будет связана. Могу ли я определить это как функцию? Как лучше всего поступить? Спасибо, @samtal
_Могу ли я определить его как функцию? Как лучше поступить?_ вопрос зависит от того, какие файлы и данные находятся в одной единице трансляции. Также есть спецификатор класса хранения extern
, который можно использовать, чтобы сообщить компилятору, что переменная определена внешне в другой единице трансляции., @hcheung
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Хотя общепринятый ответ работает, я чувствую, что Arduino "IDE" отлично подходит для начинающих, но он не очень масштабируется дальше пары файлов. Я настоятельно рекомендую проверить [platformio](https://platformio.org) так как он обеспечивает гораздо лучшее управление проектами за счет интеграции с [atom](https://atom...io) и [vscode](https://code.visualstudio.com), позволяет работать с различными фреймворками, включая Arduino for AVR, STM32, ESP8266, ESP32 и т.д., а также поддерживает отладку, если у вас есть необходимое оборудование., @Shreyas Murali
[Не пересекайте столб.](https://meta.stackexchange.com/q/64068) Вы уже [спрашивали об этом ТАК](https://stackoverflow.com/q/54194083)., @gre_gor