• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 можно отправлять на принтер только строку, а сами инструкции надо все-таки отправлять циклом.
 
Сверху Снизу