Использование программного обеспечения Serial для библиотеки Adafruit Thermal и более общий вопрос cpp

Я работаю над проверкой концепции использования библиотеки принтеров Adafruit_Thermal с ATTiny85.

В ATTiny85 нет возможности аппаратного последовательного порта, поэтому я начал изучать возможность использования SoftwareSerial для создания необходимого последовательного порта. Я пошел по этому пути и столкнулся с ошибкой в конструкторе тепловой библиотеки:

// файл примера thermo-printer.ino

#include "SoftwareSerial.h"
#define TX_PIN 3
#define RX_PIN 4 


SoftwareSerial mySerial(RX_PIN, TX_PIN);


#include "Adafruit_Thermal.h"

Adafruit_Thermal printer(&mySerial); // Передаем адрес в конструктор принтера

// Adafruit_Thermal.h

class Adafruit_Thermal : public Print
{

public:
    // ВАЖНО: синтаксис конструктора изменился по сравнению с предыдущими версиями
    // этой библиотеки. Пожалуйста, смотрите примечания в примере кода!

    Adafruit_Thermal(Stream *s = &Serial, uint8_t dtr = 255);

Документы/Arduino/libraries/Adafruit_Thermal_Printer_Library/Adafruit_Thermal.h:125:33: ошибка: «Серийный номер» не был объявлен в этой области Adafruit_Thermal(поток *s = &Serial, uint8_t dtr = 255);

Если я правильно понимаю, процесс проверки завершается ошибкой, поскольку компилятор ищет глобальное значение Serial в файле Adafruit_Thermal.h, которого не существует, поскольку У ATTiny85 нет HardwareSerial.

Но, судя по сигнатуре конструктора класса Adafruit_Thermal, передача ссылки Serial является просто значением по умолчанию (правильно?), поэтому я должен иметь возможность удалить его и передать серийную ссылку моего программного обеспечения. Класс SoftwareSerial наследуется от Stream , поэтому он все равно должен быть допустимым эталонным проходом:

// это:
Adafruit_Thermal(Stream *s = &Serial, uint8_t dtr = 255);

// меняется на это:
Adafruit_Thermal(Stream *s, uint8_t dtr = 255);

Но когда я это делаю, я начинаю получать ошибки проверки, из-за которых создается впечатление, что термальный экземпляр не был создан, например:

неопределенная ссылка на `Adafruit_Thermal::begin(unsigned char)'

и

неопределенная ссылка на `Adafruit_Thermal::Adafruit_Thermal(Stream*, unsigned char)'

Означает ли это, что класс не создается?

Я просмотрел базовое определение конструктора, чтобы увидеть, не взрывается ли там что-то, но, похоже, на уровне конструктора нет ничего необычного:

// Конструктор
Adafruit_Thermal::Adafruit_Thermal(Stream *s, uint8_t dtr) :
  stream(s), dtrPin(dtr) {
  dtrEnabled = false;
}

Это все равно должно работать с серийным эталонным проходом программного обеспечения, верно?

Я немного не понимаю, как это отлаживать. Есть идеи?

Обновить

После ответа от Маженко я открыл файл cpp и посмотрел ссылку в заголовке:

ссылка на заголовок

Значит, это означает, что файл cpp по-прежнему ссылался на файл заголовка пути включения, а не на версию lib?

Я обновил свой файл cpp, чтобы использовать:

#include "lib/Adafruit_Thermal.h"

и я все еще получаю ошибки неопределенных ссылок, так что это может быть что-то еще, но я хотел поделиться этой дополнительной информацией.

, 👍1

Обсуждение

На первый взгляд, удаление = &Serial — это именно то, что вы хотите сделать, и ведет себя именно так, как вы ожидаете. Я подозреваю, что другие ошибки, которые вы сейчас получаете, не связаны., @Majenko

Ах хорошо. Я тогда продолжу копать. Если я точно выясню, что происходит, я отпишусь. Спасибо за подтверждение!, @Chris Schmitz

Похоже, что IDE не компилирует файл .cpp из библиотеки., @Majenko

ОЙ! Святая корова, я совершенно не думал об этом! Я добавляю обновление, чтобы показать снимок экрана., @Chris Schmitz

Что это за IDE тогда?, @Majenko

А, это VSCode (https://code.visualstudio.com) с использованием расширения arduino (https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.vscode-arduino). Я разработчик веб-приложений, и у меня уже был настроен vscode так, как я хотел, поэтому переход на arduino IDE был грубым. К счастью, расширение arduino позволяет вместо vscode делать практически все, что вы хотели бы делать в IDE arduino :), @Chris Schmitz

Ах. Итак, есть ли что-то, что вам нужно сделать в этой IDE, чтобы сказать «Включить файлы в lib в компиляцию`?, @Majenko

Ваш последний комментарий помог мне разобраться. Я разместил подробное объяснение в разделе ответов. Спасибо за помощь @Majenko, @Chris Schmitz


1 ответ


2

:'( горько-сладкое решение.

После последнего комментария @majenko:

Ах. Итак, есть ли что-то, что вам нужно сделать в этой IDE, чтобы сказать «Включить файлы в lib в компиляцию»?

Я вспомнил, что эта проблема укусила меня раньше. В частности, проблема включения подпапок в скетч.

Обычно в языках программирования (по крайней мере, во всех тех, с которыми я обычно работаю) вы можете использовать относительные пути или пространства имен для включения файлов из подпапок, но по какой-то причине с Arduino, если вы хотите включить файлы из подпапок вы должны поместить файлы в каталог с именем src.

И это обязательно должен быть src. Вы не можете использовать lib, или libs, или source, или как угодно, это должно быть src.

Я не могу найти место в справочной документации по arduino или в репозитории IDE на github, где бы объяснялось, что вам нужно использовать src для имени подпапки, но вы можете найти различные упоминания на форумах. Например

https://arduino.stackexchange.com/a/54655/35534

Так что да, решение моей проблемы состояло из трех частей.

  1. Внедрение библиотеки Adafruit_Thermal в свою кодовую базу, чтобы я мог редактировать исходный код, не беспокоясь о том, что эти изменения загрязнят исходный код.
  2. Удаление ссылки &Serial в объявлении конструктора Adafruit_Thermal.h
  3. используя имя каталога src для включения элементов из подпапки.

структура решения

После этого скетч проходит проверку.

А вот и горько-сладкая часть. После того, как мы прошли через все это и увидели, что компилятор прошел проверку скетча, разорвалась бомба; скетч слишком велик для аттини:

разбитое сердце

Думаю, этого не должно было быть :'(

Ну, по крайней мере, я знаю, что вызывало ошибки компоновщика/компилятора, и я смогу спать по ночам :P

Спасибо за помощь Майенко :bows:.

,