Как создать проект ардуино с несколькими исходными файлами?
Я создаю программу arduino на Linux, используя следующий Makefile
:
ARDUINO_DIR = /usr/share/arduino
BOARD_TAG = uno
ARDUINO_PORT = /dev/ttyAMA0
ARDUINO_LIBS = Wire
include /usr/share/arduino/Arduino.mk
В настоящее время весь мой код распределен между десятком заголовочных файлов и одним файлом .ino - он компилируется и работает правильно при прошивке. Я знаю, что это неправильно, и я пытаюсь разделить свой код на правильную структуру исходных и заголовочных файлов, но когда я это делаю и пытаюсь построить его, я получаю следующий вывод:
In file included from gear.c:1:0:
gear.h:19:1: error: unknown type name ‘byte’
byte GEAR = 3;
^
Это наводит меня на мысль, что исходный файл компилируется отдельно и не знает, что такое байт
, который предположительно определен где-то в библиотеке arduino.
Как правильно построить мой проект с исходными файлами?
@php_nub_qq, 👍3
Обсуждение1 ответ
Лучший ответ:
Прежде всего, я рекомендую вам писать на C++ (расширение файла .cpp), а
не на обычном C (файлы в формате .c). Причина в том, что
среда программирования Arduino основана на C++, некоторые библиотеки
C++-только, и ваш основной файл .ino будет скомпилирован как исходный код C++. Смешивание
этого с C возможно, используя некоторые внешние объявления "C"
, но это
, вероятно, больше хлопот, чем того стоит.
Теперь, чтобы ответить на ваш вопрос, просто добавьте thsi в верхней части исходных файлов:
#include <Arduino.h>
Это включает в себя определения типов, специфичные для среды Arduino, а также основной API. Этот include автоматически добавляется в любой файл, оканчивающийся на .ino, но вы должны явно добавить его в свой. cpp Файлы.
*Смешивание этого с C возможно, используя некоторые внешние объявления "C", но это, вероятно, больше хлопот, чем того стоит.* Вы говорите о необходимости префикса всех определений переменных с помощью extern
? Даже переименовав файл в". cpp", я все равно должен был добавить это, иначе я получу ошибки, что переменные не были объявлены. Существует высокая вероятность того, что я делаю что-то не так, хотя у меня буквально 0 практического опыта работы с C/C++, @php_nub_qq
@php_nub_qq: Нет, я не говорю о внешнем
. Я хочу сказать, что вы не можете получить доступ к объектам C++ (например, "Serial") из C, а доступ к функциям C из C++ требует объявления "extern " C"., @Edgar Bonet
Ну а пока, похоже, он отлично работает с библиотекой Wire
. Спасибо, что упомянули, хотя, если я наткнусь на это, я буду знать, что искать, а не тратить 3 часа впустую., @php_nub_qq
- Эффективный рабочий процесс/инструменты для преобразования цветных изображений в шестнадцатеричные массивы
- устаревшее преобразование из строковой константы в 'char*'
- как быстро loop() работает в Arduino
- Как загрузить шестнадцатеричный файл в arduino uno?
- как отправить аргумент объектам ESP8266WebServer в функции
- avr/io.h ошибка "No such file or directory" при компиляции с использованием avr-gcc
- Arduino синтаксический анализ строки с использованием sscanf
- Объявление переменной внутри основного цикла
avrdude - это загрузчик/загрузчик ... он не занимается никаким строительством, @jsotola
@jsotola Прошу прощения, моя ошибка., @php_nub_qq
В C есть байтовый тип данных, который называется char. для переворачивания битов в ardunio вы можете использовать BitSet, который позволяет изменять значения битов в типе данных. https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitset/ не совсем уверен, что именно вы делаете., @j0h