Не удалось заставить мою созданную библиотеку работать - пока она компилируется
Я экспериментирую с созданием собственных библиотек Arduino. К сожалению, пока программа компилируется, конечный результат не работает.
В целях эксперимента я разбил библиотеку на две части. Тот, который будет обрабатывать мигание, управляя контактом LED_BUILDIN
, и тот, который будет взаимодействовать с последовательным входом.
Итак, два файла .h
и два файла .cpp
. Кроме того, есть еще один файл для конфигурации, который обрабатывает директивы препроцессора, которые читает библиотека.
Это код:
ФАЙЛ 1
//header_config.h
#ifndef MY_CONFIGURATION
#define MY_CONFIGURATION
#include <Arduino.h>
#define SERIAL_DEBUG
#define LED_BLINK
#include <led_functions.h>
#include <serial_functions.h>
void my_setup()
{
my_setup_led();
}
void my_loop()
{
led_blinker();
serial_transmit("Hello");
}
#endif
ФАЙЛ 2
//led_functions.h
#ifndef MY_LED_LIBRARY
#define MY_LED_LIBRARY
#include <Arduino.h>
#include "header_config.h"
#include "serial_functions.h"
extern void led_blinker();
extern void my_setup_led();
#endif
ФАЙЛ 3
//led_functions.cpp
void led_blinker()
{
#ifdef LED_BLINK
digitalWrite(LED_BUILTIN, HIGH);
serial_transmit("LED ON");
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
serial_transmit("LED OFF");
delay(1000);
#endif
}
void my_setup_led()
{
#ifdef LED_BLINK
pinMode(LED_BUILTIN, OUTPUT);
#endif
}
ФАЙЛ 4
//serial_functions.h
#ifndef MY_SERIAL_LIBRARY
#define MY_SERIAL_LIBRARY
#include <Arduino.h>
#include "header_config.h"
#ifdef SERIAL_DEBUG
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
SoftwareSerial mySerial(rxPin, txPin);
#endif
extern void serial_transmit(char*);
#endif
ФАЙЛ 5
//serial_functions.cpp
void serial_transmit(char *str)
{
#ifdef SERIAL_DEBUG
//mySerial.begin(9600);
//mySerial.println(str);
//mySerial.end();
Serial.begin(9600);
Serial.println(str);
Serial.end();
#endif
}
Обратите внимание, что хотя серийный код создает объект SoftwareSerial
(в serial_functions.h
), я не использую его (в serial_functions.cpp
) и вместо этого я использую аппаратный Serial. Причина в отладке, чтобы я мог видеть связь на ПК. Я оставил объект SoftwareSerial
внутри, потому что это то, чего я в конечном итоге хочу.
Наконец, за пределами библиотеки в отдельной папке находится файл .ino
, который использует эту библиотеку.
#include <header_config.h>
#include <led_functions.h>
#include <serial_functions.h>
void setup()
{
my_setup();
}
void loop()
{
my_loop();
}
Как я уже сказал, программа компилируется нормально, но в реальном мире она не работает. Ни мерцание, ни последовательная связь.
@user1584421, 👍-1
1 ответ
Лучший ответ:
Ваши файлы cpp не включают файл header_config.h, поэтому в них не определены SERIAL_DEBUG и LED_BLINK.
Содержимое включенного файла заменяет директиву include, поэтому, если вы теперь включите header_config.h в оба cpp, будет 3 функции с именем my_setup() и 3 функции с именем my_loop(), и компоновщик будет жаловаться. Таким образом, вы не можете поместить определения функций во включаемый файл. И по той же причине вы не можете иметь определения переменных в файле .h, поэтому экземпляр SoftwareSerial также вызовет проблемы, если он будет использоваться.
- Считается ли #ifdef __SD_H__ плохой практикой?
- Странное поведение defines - специфично ли это для Arduino и как оно работает?
- #define from main (.ino) не учитывается компилятором в собственных библиотеках
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Wire.h не найден!
«Ваши файлы cpp не включают файл header_config.h, поэтому в них не определены SERIAL_DEBUG и LED_BLINK». Зачем это нужно, если оба заголовочных файла включены в
header_config.h
? И последний файл .ino вызывает header_config.h. Кроме того, поскольку заголовочные файлы используют ключевое словоextern
для определения функций, разве это не должно работать?, @user1584421@user1584421 user1584421 файлы cpp не включают файлы .h, поэтому они не включают header_config.h по сравнению с другими файлами .h., @Juraj
И что вы предлагаете мне делать с объектом «SoftwareSerial»? Должен ли он вместо этого перейти к файлу
cpp
?, @user1584421@ user1584421 вы используете его только в serial_functions.cpp, так что да, @Juraj
Мне удалось заставить его работать! Спасибо! Однако мне до сих пор неясно, почему я должен включать <header_config.h> в файлы .cpp. Как вы сказали, содержимое файлов заменяет директиву include. Итак, если в header_config.h я включаю файлы .cpp, а затем в файлы .cpp, включаю обратно файл header_config.h, разве это не похоже на то, что файл header_config.h включает себя обратно?, @user1584421
@ user1584421 файлы заголовков не скомпилированы. Строка #include заменяется препроцессором содержимым включаемого файла, поэтому содержимое включаемого файла становится частью предварительно обработанного файла cpp, а затем компилируется., @Juraj