Использование программного обеспечения 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"
и я все еще получаю ошибки неопределенных ссылок, так что это может быть что-то еще, но я хотел поделиться этой дополнительной информацией.
@Chris Schmitz, 👍1
Обсуждение1 ответ
:'( горько-сладкое решение.
После последнего комментария @majenko:
Ах. Итак, есть ли что-то, что вам нужно сделать в этой IDE, чтобы сказать «Включить файлы в lib в компиляцию»?
Я вспомнил, что эта проблема укусила меня раньше. В частности, проблема включения подпапок в скетч.
Обычно в языках программирования (по крайней мере, во всех тех, с которыми я обычно работаю) вы можете использовать относительные пути или пространства имен для включения файлов из подпапок, но по какой-то причине с Arduino, если вы хотите включить файлы из подпапок вы должны поместить файлы в каталог с именем src
.
И это обязательно должен быть src
. Вы не можете использовать lib
, или libs
, или source
, или как угодно
, это должно быть src.
Я не могу найти место в справочной документации по arduino или в репозитории IDE на github, где бы объяснялось, что вам нужно использовать src
для имени подпапки, но вы можете найти различные упоминания на форумах. Например
https://arduino.stackexchange.com/a/54655/35534
Так что да, решение моей проблемы состояло из трех частей.
- Внедрение библиотеки
Adafruit_Thermal
в свою кодовую базу, чтобы я мог редактировать исходный код, не беспокоясь о том, что эти изменения загрязнят исходный код. - Удаление ссылки
&Serial
в объявлении конструктораAdafruit_Thermal.h
- используя имя каталога
src
для включения элементов из подпапки.
После этого скетч проходит проверку.
А вот и горько-сладкая часть. После того, как мы прошли через все это и увидели, что компилятор прошел проверку скетча, разорвалась бомба; скетч слишком велик для аттини:
Думаю, этого не должно было быть :'(
Ну, по крайней мере, я знаю, что вызывало ошибки компоновщика/компилятора, и я смогу спать по ночам :P
Спасибо за помощь Майенко :bows:.
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Библиотека программных материалов для плат SAMD
- Дата и время GPS не отображаются правильно в Arduino Uno,NEO6M GPS модуль
- Связь AtTiny44 и AtTiny 85
- Термопринтер Adafruit печатает слабо
- Использование Arduino в качестве ISP и программного обеспечения одновременно
- ATtiny85 со сном и последовательным портом
- Дека Adafruit с esp32
На первый взгляд, удаление
= &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