Как создать проект ардуино с несколькими исходными файлами?

programming c avrdude linux arduino-makefile

Я создаю программу 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.

Как правильно построить мой проект с исходными файлами?

, 👍3

Обсуждение

avrdude - это загрузчик/загрузчик ... он не занимается никаким строительством, @jsotola

@jsotola Прошу прощения, моя ошибка., @php_nub_qq

В C есть байтовый тип данных, который называется char. для переворачивания битов в ardunio вы можете использовать BitSet, который позволяет изменять значения битов в типе данных. https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitset/ не совсем уверен, что именно вы делаете., @j0h


1 ответ


Лучший ответ:

2

Прежде всего, я рекомендую вам писать на 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