2015-06-05 5 views
1

Я пытаюсь отправить команды ESC/POS на термопринтер. Но всякий раз, когда я отправляю их, термопринтер печатает их как текст, а не выполняет их как команды. Я пишу эти команды в файле .prn, и всякий раз, когда я выполняю команду lp для печати файла, этот .prn-файл также печатается, но как текст.Как отправить команды ESC/POS на термопринтер в Linux

Я попробовал следующий метод, чтобы написать ESC/POS команды в файле .prn:

1) PRINT #1, CHR$(&H1D);"h";CHR$(80); 
    PRINT #1, CHR$(&H1D);"k";CHR$(2); 
    PRINT #1, "48508007";CHR$(0); 
    PRINT #1, CHR$(&HA); 
    PRINT #1, CHR$(&H1D);"k";CHR$(67);CHR$(12); 
    PRINT #1, "48508007"; 

2) <ESC>(0x1B) <L>(0x4C) 
    <GS>(0x1D) <k>(0x6B) 73 2 4 5 6 7 8 9 NUL 
    <FF>(0x0c) 

3) <ESC L> 
    <GS k 73 2 4 5 6 7 8 9 NUL> 

4) "ESC L" "GS K 73 2 4 5 6 7 8 9 NUL" "FF" Я также попытался отправки команды ESC/POS с помощью программы C, как:

#include<stdio.h> 
#include<stdlib.h> 
#include<fcntl.h> 

int main() { 
    int fd,ret; 
    char buf[] = "HELLO" 

    fd = open("/dev/bus/usb/003/007",O_WRONLY); 
    if(fd < 3) { 
     perror(open failed); 
    } 

    ret = write(fd,&buf,sizeof(buf)); 
    if(ret == -1) { 
     perror("write failed"); 
    } 
} 

После выполнения приведенный выше код дает ошибку как:

write failed: invalid arguments 

ответ

0

Если вы уверены в шестнадцатеричных кодах, вы можете использовать свой любимый шестнадцатеричный редактор для создания надлежащего командного файла prn. Или вы можете выбрать один здесь: Need a good hex editor for Linux
Зачем нужен редактор hex? Потому что все остальное, включая , скрытое содержимое (например, новая строка 0x0d), и принтер не может понять последовательность команд. Вероятно, другая проблема - это программа, которую вы используете для доставки команды. Иногда программа иногда добавляет другой контент или делает какой-то разговор при отправке его на принтер (например, дополнительная страница вниз). Убедитесь, что ваша программа не может этого сделать.
Мой способ решения проблем на этот раз:

  • быть уверены, что побег sequencies правильно. (Некоторый принтер использует специальную escape-последовательность, чтобы отметить - следующий бит-поток будет командой, а не данными)
  • убедитесь, что файл, который вы хотите отправить на принтер, верен (никакого дополнительного кода в файле - простой способ для проверки есть mc viewer - вид в шестнадцатеричном режиме (F4))
  • убедитесь, что доставка на принтер исправлена ​​bitvise - программа доставки не управляет командным файлом (используйте man для проверки) - как конвертировать непечатаемые символы в шестнадцатеричный код
+0

Спасибо, что вам понравился @abartek. Я пробовал это без успеха. – user3860949

+0

Я отправляю этот файл на принтер с помощью команды lp, которая предназначена для печати файла. Правильно ли это отправить команды на принтер или какой-либо другой способ сделать это. Этот термопринтер подключен к системе с помощью USB-порта. – user3860949

+0

Есть ли поддержка библиотеки на языке C для этого. – user3860949

0

Если термопринтер подключен через USB, есть вероятность, что CUPS заявит об этом порту. Следовательно, вы не сможете отправлять данные на него как обычный пользователь.

Чтобы отправить необработанные байты через чашки, используйте либо lpr -l file, либо lp -o raw file. Чтобы проверить байты, которые вы собираетесь отправить, используйте шестнадцатеричный просмотрщик xxd. Эти принтеры обычно принимают CRLF в конце строки, поэтому обязательно отправьте \r\n.

У меня нет библиотеки C для вас, но я имел успех с python-escpos

2

Есть на самом деле две проблемы: транспорт данных, а также транспортируемые данные.

Передача данных: Использование usblp

Для получения данных на принтер, убедитесь, что usblp загружен. Он позволяет открыть принтер в виде файла в группе lp, чтобы вы могли открыть его как /dev/usb/lp0.

После того, как это работает, как обычный пользователь, вы можете написать:

echo "Hello" > /dev/usb/lp0

Я написал blog post on the topic, которая охватывает права доступа сторону этого.

Формат данных

Во-вторых, сами данные должны быть отправлены в правильном двоичном формате. Принтер не будет понимать этот файл с читаемым человеком .prn (print?) Напрямую, поэтому его необходимо преобразовать в правильный двоичный формат.

Интерпретировать несколько вещей из вашего вопроса:

  • ESC означает \x1b, ASCII, избежать
  • k означает ``, фактический ASCII буквы К
  • CHR$(80) означает \x50, который, как номер 80 отправляется на принтер.
  • CHR$(&H1D); означает \x1d, ASCII, разделитель групп (GS)

Вы можете написать некоторые основные команды непосредственно на CLI с помощью echo -e. Возможно, самым простым нетекстовым примером является штрих-код CODE39, который говорит «000».

Эта же команда в удобной для восприятия человеком форме, то гекс, то, как команда терминала будет:

  • GS k 4 0 0 0 NUL
  • 1d 6b 04 30 30 30 00
  • echo -e '\x1d\x6b\x04000\x00' > /dev/usb/lp0

Ваша лучшая рекомендация для этого формат - это руководство по программированию вашего принтера, но, надеюсь, это поможет вам интерпретировать его.

Помните, что команды, которые вы пытаетесь выполнить, содержат ошибки, и один из них даже уловит вас в режиме страницы.

Кроме того, ответы @scruss и @abartek полностью точны: убедитесь, что CUPS не заявлял об этом порту с помощью команды lsusb и использует шестнадцатеричный редактор для просмотра вашего вывода или библиотеки для генерации известных, хорошие команды.