• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Термопринтер этикеток и esp8266 по UART

MapaT

New member
Во вложении документация к термопринтеру этикеток. Подключен по UART к esp8266.

Подскажите на парочке примеров как использовать эти инструкции для печати.

Выдержка из документации для примера:
Instruction names - Text drawing
instruction code - hexadecimal :a. 1A 54 00 x_L x_H y_L y_H String00 b : 1A 54 01 x_L x_H y_L y_H FontHeight_L FontHeight_H FontType_L FontType_H String00

Как это отправить в UART?
 

Вложения

MapaT

New member
Более конкретный вопрос.
Скажите как на этом принтере распечатать "Hello world"??
 

CodeNameHawk

Moderator
Команда форума
Попробуйте создать массив, в него запишите все эти из примера 1B 40 1a... в 16-теричном значении и посимвольно отправьте в сериал.
 

MapaT

New member
Попробуйте создать массив, в него запишите все эти из примера 1B 40 1a... в 16-теричном значении и посимвольно отправьте в сериал.
Подать этикетку в положение отрыва по инструкции Hex :1A 0C 00

byte vals[] = {0x1A, 0x0C, 0x00};
for (int i = 0; i < sizeof(vals); i++) {
printer.write(vals);
}
Как-то так?
 

CodeNameHawk

Moderator
Команда форума
Примерно так.
Если делать на Arduino:
Настройте скорость сериала Serial.begin(9600);
потом передавайте Serial.print(vals);
Можно посмотреть, что отвечает принтер Serial.Available , Serial.read()

Можно попробовать послать одним махом, добавив перевод каретки.
char vals[] = {0x1A, 0x0C, 0x00};
Serial.println(vals);
Правда последний ноль она так съест:
1A 0C 0D 0A
 
Последнее редактирование:

MapaT

New member
Примерно так.
Если делать на Arduino:
Настройте скорость сериала Serial.begin(9600);
потом передавайте Serial.print(vals);
Можно посмотреть, что отвечает принтер Serial.Available , Serial.read()

Можно попробовать послать одним махом, добавив перевод каретки.
char vals[] = {0x1A, 0x0C, 0x00};
Serial.println(vals);
Правда последний ноль она так съест:
1A 0C 0D 0A
Да на ардуино. Serial.begin(9600) так и есть.
Передать одним махом char vals[] = {0x1A, 0x0C, 0x00}; Serial.println(vals); не получилось. Принтер молчит.
Так срабатывает:
char vals[] = {0x1A, 0x0C, 0x00};
for (int i = 0; i < sizeof(vals); i++) {
mySerial.print(vals);
}
Печатать текст так и не заставил.
Вообще надеялся на библиотеку Adafruit thermal printer. Но из примеров как-то через раз печатает изображение и QR-код. с текстом опять же не вышло.
В интернете есть примеры с термопринтерами чеков, но с этикетками что-то совсем нет примеров. Хотя по сути все тоже самое должно быть, кроме отслеживания линии отрыва.
 

enjoynering

Well-known member
Передать одним махом char vals[] = {0x1A, 0x0C, 0x00}; Serial.println(vals); не получилось. Принтер молчит.
а вы попробуйте вот так
Код:
Serial.print(vals);
изучите чем отличается print от println и что такое перевод сткоки \n
 

MapaT

New member
а вы попробуйте вот так
Код:
Serial.print(vals);
изучите чем отличается print от println и что такое перевод сткоки \n
#include "SoftwareSerial.h"
#define TX_PIN 6
#define RX_PIN 5

SoftwareSerial mySerial(RX_PIN, TX_PIN);

void setup() {
mySerial.begin(9600);

char vals[] = {0x1A, 0x0C, 0x00};
mySerial.println(vals); //mySerial.print(vals); - тоже не реагирует.
}
void loop() {
}
#include "SoftwareSerial.h"
#define TX_PIN 6
#define RX_PIN 5

SoftwareSerial mySerial(RX_PIN, TX_PIN);

void setup() {
mySerial.begin(9600);

char vals[] = {0x1A, 0x0C, 0x00};

for (int i = 0; i < sizeof(vals); i++) {
mySerial.print(vals);
}
}
void loop() {
}


Чтоб нагляднее было, приложил скетчи под спойлер.
т.е. срабатывает только если передавать циклом.
 

tretyakov_sa

Moderator
Команда форума
Да на ардуино. Serial.begin(9600) так и есть.
Передать одним махом char vals[] = {0x1A, 0x0C, 0x00}; Serial.println(vals); не получилось. Принтер молчит.
Так срабатывает:
char vals[] = {0x1A, 0x0C, 0x00};
for (int i = 0; i < sizeof(vals); i++) {
mySerial.print(vals);
}
Печатать текст так и не заставил.
Вообще надеялся на библиотеку Adafruit thermal printer. Но из примеров как-то через раз печатает изображение и QR-код. с текстом опять же не вышло.
В интернете есть примеры с термопринтерами чеков, но с этикетками что-то совсем нет примеров. Хотя по сути все тоже самое должно быть, кроме отслеживания линии отрыва.
Код:
uint8_t vals[] = {0x1A, 0x0C, 0x00};
  for (int i = 0; i < sizeof(vals); i++) {
    mySerial.write(vals[i]);
  }
 

CodeNameHawk

Moderator
Команда форума
Можно предположить, что это младший и старший байты позиции по Х.
Задайте их нп. 0x01 0x00 и по У также.
Текст в кодировке asci заканчивающийся нулём.
1A 54 00 x_L x_H y_L y_H String00
Пошлите это принтеру, заменив как описал выше.
И остальные в том же духе.
 
Последнее редактирование:

enjoynering

Well-known member
Я друго не понимаю по идее класс Print.h унаследованый классом Serial.h умеет сам печать весь array[], без всяких for-loop.
 

MapaT

New member
Я друго не понимаю по идее класс Print.h унаследованый классом Serial.h умеет сам печать весь array[], без всяких for-loop.
Разобрался. Принтер не воспринимает инструкцию к печати текста именно как печать.
т.е. Сначала идет инструкция задания размеров страницы, далее формирование всего изображения(будь то текст или qr-код), далее инструкция завершения формирования страницы, далее инструкция запуска на печать.
Могу ошибаться, но видимо println можно отправлять на принтер только строку, а сами инструкции надо все-таки отправлять циклом.
 
Сверху Снизу