Термопринтер от кассового аппарата
- Войдите на сайт для отправки комментариев
String inputString; void setup() { Serial.begin(19200); delay(500); Serial.println(F("--------input string (ENTER=Finish)------------")); } void loop() { inputString=Serial.readString(); if(inputString.length()>0){ Serial.println("pechataem S terminala :"+inputString+ ""); inputString =String( " 1 ПРИВЕТ"); Serial.println(("pechataem stroky1 :"+inputString+ "")); // printString(); //печать на термопринтере // motorStep(3000); inputString =String( " 2 PRIVET"); Serial.println(("pechataem stroky2 :"+inputString+ "")); // printString(); //печать на термопринтере // motorStep(3000); char putString[] = "\40\63\40\317\360\350\342\345\362";//ПРИВЕТ WIN1251 inputString = String(putString); Serial.println(("pechataem stroky3 :"+inputString+ "")); // printString(); //печать на термопринтере // motorStep(3000); } }
Не получается победить кодировку кириллицы для вывода на термопринтер. Печать работает но при компиляции в разных версиях IDE ведёт себя по разному и не так как нужно.
IDE1.6.6 IDE1.8.13
№ монитор термопринтер монитор термопринтер
13 привет привет кракозябры привет
16 кракозябры кракозябры привет кракозябры
20 PRIVET PRIVET PRIVET PRIVET
26 Привет Привет 6-кубиков Привет
Собственно интересует строка кода №16, то есть текст набранный кириллицей был распечатан на термопринторе тоже на кириллице. Вывод в монитор IDE не важен. Понимаю что это связано с кодировками шрифта, но как это исправить ?
Изучай мануал к принтеру. Хз в какой кодировке он хавает данные.
судя по всему хавает 1251 а у 1,8 скетч и вывод в порт в ютф.
а чего кракозябрами не пишется? сначала все на латинице, а потом как все написал - заменил на вот такие приветы "\40\63\40\317\360\350\342\345\362"
ну или хз чо будет, но можно попробовать писать в нотопеаде++ илитп изменив на кодировку 1251, а в иде 1,6 выбрать использовать внешний редактор. иде обратно кодировку не переделывает, как есть так и загружает. а сериал и так в 1251 у него выводит если я правильно понял что там написано.
Изучай мануал к принтеру. Хз в какой кодировке он хавает данные.
Судя по строкам 24 - 26 он хавает данные в WIN1251.
По гуглить смещение в кодировках utf8 ahci & win1251. В скетче считывать в массив char и преобразовывать коды прибавляя или отнимая смещение.
Можно сделать тестовый цикл, который от 0 до 300 разпечатает все символы в формате "число=символ".
Сравнить сериал ide и напечатанное на бумаге. Вычислить смещение будет не трудно и гуглить не надо :)
Вообще-то очень странно: первый раз вижу, чтобы слово, набранное ЗАГЛАВНЫМИ, печаталось строчными.
Но в общем случае исправлять следует так:
1. Выяснить, какая кодировка нужна принтеру.
2. Выяснить, какая кодировка используется в IDE.
3. Перекодировать из 2 в 1.
А ещё не плохо бы название принтера.
По гуглить смещение в кодировках utf8 ahci & win1251. В скетче считывать в массив char и преобразовывать коды прибавляя или отнимая смещение.
Можно сделать тестовый цикл, который от 0 до 300 разпечатает все символы в формате "число=символ".
Сравнить сериал ide и напечатанное на бумаге. Вычислить смещение будет не трудно и гуглить не надо :)
Чушь:
1. О каком "смещении" вообще идет речь?
2. Алгоритм для обработки кодировки символов переменной длины вообще не может быть основан на "преобразовании кодов char".
3. Откуда взялся диапазон от 0 до 300? (откуда бы ни взялся - это в любом случае неверно)
1 Код символа "А" в utf8 и 1251 - разный. Разница этих кодов и является смещением.
2 привет "\40\63\40\317\360\350\342\345\362"
3 Там 130 или 150 адрес последний в одной из кодировок. Я просто умножил на 2. Можно и до тысячи прогнать цикл. Но проще посмотреть в гугле.
PS https://wiki.iarduino.ru/page/encoding-arduino/
2. Выяснить, какая кодировка используется в IDE.
3. Перекодировать из 2 в 1.
andriano, при наборе текста в терминале IDE (версии 1.6.6 - это критично) принтер повторяет текст 1 в 1, что кириллицу, что латиницу (в полной программе после № 13 вызывается печать).
Ваши пункты 2 и 3 содержатся в стартовом топики (возможно несколько завуалированном виде) вот в этом и вопрос.
Термопринтер от кассы миника 1102ф, на самой термоголовке нет маркировки. Скорее всего это ТД или (ТВ)4032а или её аналог Т1001Б. Но это так для справки так как повторю принтер печатает текст и рус и лат, но только с окна терминала IDE1.6.6
rs: по случаю достались 5 касс, вот и решил сделать печать этикеток на свой напитки.
Дядя, ну так распечатай от 128 до 255 и погляди.
По таблице до /177 идёт без изменений. Вам осталось переписать байты в не совпадающих местах.
Определяем размер с помощью length(). И циклом вынимаем getBytes() в свою переменную и меняем на нужную при значении более /177. Далее записать полученное значение в новый стринг. Вывести переделанный стринг на принтер. Всё.
Там 6 разных смещений а значит в 7 if-ов можно влезть. Первый будет значения до /177 писать без изменений.
andriano, я выяснил IDE 1.6.6 сохраняет текст в UTF-8, а терминал отправляет текст WIN 1251 и программа управления термопринтером понимает WIN 1251 поэтому и печатает и рус и лат.
Осталось самая малость. Сделать конвертацию текста UTF-8 > WIN 1251 и можно будет пихать всё в корпус.
andriano, я выяснил IDE 1.6.6 сохраняет текст в UTF-8, а терминал отправляет текст WIN 1251 и программа управления термопринтером понимает WIN 1251 поэтому и печатает и рус и лат.
Осталось самая малость. Сделать конвертацию текста UTF-8 > WIN 1251 и можно будет пихать всё в корпус.
Так а вы пробовали сам скетч в 1251 перевести? Может и не понадобится ничего конвертировать.
Только Printer.println() нужно в конце печати.
Green, спасибо, но у меня уже всё работает, скетч конвертации для строки.
1 Код символа "А" в utf8 и 1251 - разный. Разница этих кодов и является смещением.
2 привет "\40\63\40\317\360\350\342\345\362"
3 Там 130 или 150 адрес последний в одной из кодировок. Я просто умножил на 2. Можно и до тысячи прогнать цикл. Но проще посмотреть в гугле.
PS https://wiki.iarduino.ru/page/encoding-arduino/
1. Видите ли, понятие "код символа" однозначно только для кодировок фиксированной длины. utf8 к таковым не относится. Поэтому, как минимум, следует указать, что лично Вы в данном конкретном случае подразумеваете под словосочетанием "код символа".
Идем дальше, предположим, мы выяснили, что такое "код символа" и теперь можем использовать его в арифметических операциях. Теперь представьте, для "А" указанная Вами разница одна, для "Б" - другая, для "С" - третья. Что именно в данном случае является смещением?
3. Если кодировка 7-битная, в ней 128 символов, если 8-битная - 256, если же 16-битная - 65536. Вопрос: зачем "прогонять цикл" до каких-то других чисел кроме указанных трех?