Не удалось заставить мою созданную библиотеку работать - пока она компилируется

Я экспериментирую с созданием собственных библиотек 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
}

Обратите внимание, что хотя серийный код создает объект SoftwareSerialserial_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();
}

Как я уже сказал, программа компилируется нормально, но в реальном мире она не работает. Ни мерцание, ни последовательная связь.

, 👍-1


1 ответ


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

1

Ваши файлы cpp не включают файл header_config.h, поэтому в них не определены SERIAL_DEBUG и LED_BLINK.

Содержимое включенного файла заменяет директиву include, поэтому, если вы теперь включите header_config.h в оба cpp, будет 3 функции с именем my_setup() и 3 функции с именем my_loop(), и компоновщик будет жаловаться. Таким образом, вы не можете поместить определения функций во включаемый файл. И по той же причине вы не можете иметь определения переменных в файле .h, поэтому экземпляр SoftwareSerial также вызовет проблемы, если он будет использоваться.

,

«Ваши файлы 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