Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать чеков, Чековый термопринтер Custom VPK 80 II 
V
    Опции темы
PriZraK
Дата 27.11.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Здравствуйте.
Чековый термопринтер CustomVKP-80II
Необходимо из дельфийского приложений производить печать чеков.

Был найден мануал по данному девайсу – http://www.custom.biz/downloads/depliants/...80II_Rev105.pdf из которого удалось подчерпнуть информацию о ESC/POS командах.

В качестве примера, приведён следующая запись:
Код

{Set Notch Distance}
$1D $E7 $00 $00
{Print text}
TICKET 1 $0A FIRST LINE $0A SECOND LINE $0A
{Cut alligment}
$1D $F8
{Cut}
ESC i


Попытки воплотить эту запись в рабочий код дельфи приложения не увенчалась успехом:
Код

var
  FileOut: TextFile;
begin
  AssignFile(Fileout, 'COM1');
  Rewrite(Fileout);
  Writeln(FileOut,$1D, $E7, $00, $00);
  Writeln(FileOut,'TICKET 1', $0A, 'FIRST LINE', $0A, 'SECOND LINE', $0A);
  WriteLN(FileOut,$1D, $F8);
  WriteLN(FileOut,Chr(27)+'i');
  Closefile(FileOut);

Принтер печатает:
user posted image

Тестовую страницу (по кнопке на самом принтере) печатает отлично:
user posted image

До этого не доводилось работать из дельфи не с обычными принтерами не принтерами поддерживающие команды ESC/POS, да и с самими командами ESC/POS – скорее всего, либо необходимо верно инициализировать принтер перед печатью, либо отправлять по иному.
Стоит сказать, что при попытке печатать тестовую страницу из виндовса, вылезает кусок бумаги с метр длины с такими же кракозяблами.


PM MAIL ICQ Skype GTalk   Вверх
_Dimon_
Дата 27.11.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

Репутация: нет
Всего: 1



Цитата(PriZraK @  27.11.2010,  18:31 Найти цитируемый пост)
Стоит сказать, что при попытке печатать тестовую страницу из виндовса, вылезает кусок бумаги с метр длины с такими же кракозяблами.


Не должно так быть. Из под винды должно нормально печатать. Копай в сторону драйвера принтера. Посмотри что есть в свойствах принтера-Дополнительно-Обработчик печати.

З.Ы. У меня есть большой опыт работы с термопринтерами Zebra. Но в своей программе я не использовал ESC/POS команды, всегда обходился стандартными методами печати.
PM MAIL   Вверх
Snowy
Дата 29.11.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Возьми дельфи < 2009
или используй другие способы печати в порт.
Судя по картинке, ты гонишь в порт юникод текст.
А тебе нужно слать набор байт.
PM MAIL   Вверх
CROTishka
Дата 29.11.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 30.7.2009

Репутация: 1
Всего: 2



так пробовал?
Код

const
  com1: AnsiString = 'COM1';

PM MAIL   Вверх
RinOSpro
Дата 29.11.2010, 14:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В системе для COM1 установи BaudRate, Parity, FlowControl и т.д., значения, которые должны быть написаны в мануале, или на сайте производителя.

И на всякий случай, через программу Aspycom посмотри что ты передаешь в com порт.

Это сообщение отредактировал(а) RinOSpro - 29.11.2010, 14:46
  Вверх
PriZraK
Дата 30.11.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Попробовал подключить термопринтер через порт USB, установил драйвер VKP80_win.exe, затем поставил VKP80II_Opos.exe для тестирования принтера, в частности хотел проверить работу с POS-командами.
После этих манипуляций, принтер начал печатать как тестовую страницу Windows, так и нормально отвечать на POS команды и выполнять их.

Проблема в том, что необходимо заставить его работать по COM порту.
Предварительно удалив принтер из системы, проделал все те же действия, что и при установке с USB разве что выбрал,работу с COM портом, выставил скоростью 19200 bps и назначил управление потоком Xon / Xoff – все эти данные взяли конфигурации принтера (удерживая кнопку LF, включить принтер, отпустить кнопку, когда принтер начнет печать).
Вот кстати она:
user posted image

Но после этих действий, я не смог нормально распечатать ни тестовую страницу (метры чека с абракадаброй), ни поработать с POS командами через утилиту VKP80II_Opos.exe.
В качестве эксперимента проделывал всё тоже самое на ином компьютере – те же проблемы.
PM MAIL ICQ Skype GTalk   Вверх
Xenag
Дата 30.11.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 51
Регистрация: 6.3.2010

Репутация: нет
Всего: нет



Версию дельфи огласи, пожалуйста...
Хотя  и так понятно, что она 2009 или выше.
1. Перестань гнать через WriteLn. WriteLn уже нарушает твой протокол.
2. Используй стримы или WinAPI для печати в порт.
3. Используй 8-битную ANSI кодировку принудительно. Твой принтер с юникодом не дружит.
PM   Вверх
PriZraK
Дата 2.12.2010, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Получилось. Ещё раз сделал PrintSetup (удерживая кнопку LF, включить принтер, отпустить кнопку, когда принтер начнет печать), оказывается скорость стояла 57600 bps, ведать в прошлый раз не корректно вышел из этого режима. Настроил порт в виндовсе, а так же в VKP80II_Opos.exe – принтер начал работать нормально. Пол дела сделано.
Покопавшись с WinAPI, как посоветовал Xenag, получилось выводить на принтер заданный текст.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  ComPort = 'COM1';

var
  Form1         : TForm1;
  ComFile       : THandle;
  ReadAr        : array[1..255] of byte;
  BytesWritten  : DWORD;
  BytesRead     : DWORD;


implementation

{$R *.dfm}


// OpenCOMPort
function OpenCOMPort: Boolean;
var
  DeviceName: array[0..80] of Char;
begin
  StrPCopy(DeviceName, ComPort);
  ComFile := CreateFile(DeviceName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if ComFile = INVALID_HANDLE_VALUE then
    Result := False
  else
    Result := True;
end;


// SetupCOMPort
function SetupCOMPort: Boolean;
const
  RxBufferSize = 256;
  TxBufferSize = 256;
var
  DCB: TDCB;
  CommTimeouts: TCommTimeouts;

begin
  Result := True;
  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then Result := False;
  //получаем структуру CommTimeouts что бы не заполнять все вручную
  if not GetCommState(ComFile, DCB) then Result := False;
  DCB.BaudRate:=57600;
  DCB.ByteSize:=8;
  DCB.Parity:=NoParity;
  DCB.StopBits:=ONESTOPBIT;
  DCB.Flags:=DTR_CONTROL_ENABLE;
  if not SetCommState(ComFile, DCB) then Result := False;
  // получаем структуру CommTimeouts что бы не заполнять все вручную
  GetCommTimeouts(ComFile, CommTimeouts);
  // устанавливаем
  with CommTimeouts do begin
    ReadIntervalTimeout :=MAXDWORD;  // функция ReadFile возвращает
    ReadTotalTimeoutMultiplier := 0; // немедленно все имеющиеся
    ReadTotalTimeoutConstant := 0;   // байты в приемном буфере
    WriteTotalTimeoutMultiplier := 0;// общий тайм-аут для
    WriteTotalTimeoutConstant := 0;  // операции записи не используется.
  end;
  //записываем измененную структуру
  if not SetCommTimeouts(ComFile, CommTimeouts) then Result := False;
end;


// CloseCOMPort
procedure CloseCOMPort;
begin
  CloseHandle(ComFile);
end;


procedure TForm1.Button1Click(Sender: TObject);
const
  Init          : array[1..2] of Byte = ($1B,$40);
  SetDistance   : array[1..4] of Byte = ($1D,$E7,$00,$00);
  Center        : array[1..3] of Byte = ($1B,$61,$01);
  FontSize      : array[1..3] of Byte = ($1B,$21,20);
  CutAlligment  : array[1..2] of Byte = ($1D,$F8);
  Cut           : array[1..2] of Byte = ($1B,$69);
var
  Text    : PAnsiChar; // буфер данных для передачи
  nWrite  : DWord;     // число записанных байт
begin
  // открываем порт
  if OpenCOMPort then begin
    Memo1.Lines.Add('Порт открыт');
    // настраиваем
    if SetupCOMPort then begin
      Memo1.Lines.Add('Порт настроен');
      //Initialize
      WriteFile(ComFile, Init, SizeOf(Init), BytesWritten, nil);
      // Set Notch Distance
      WriteFile(ComFile, SetDistance, SizeOf(SetDistance), BytesWritten, nil);
      // Center
      WriteFile(ComFile, Center, SizeOf(Center), BytesWritten, nil);
      // FontSize
      WriteFile(ComFile, FontSize, SizeOf(FontSize), BytesWritten, nil);
      // Text
      Text  := PAnsiChar('TICKET 1' + #$0A+'TEST' + #$0A+ 'SECOND LINE' + #$0A);
      WriteFile(ComFile, Text^, Length(Text)+1, nWrite, nil);
      // Cut alligment
      WriteFile(ComFile, CutAlligment, SizeOf(CutAlligment), BytesWritten, nil);
      // Cut
      WriteFile(ComFile, Cut, SizeOf(Cut), BytesWritten, nil);
      // закрываем порт
      CloseHandle(ComFile);
    end else begin
      Memo1.Lines.Add('Не удалось настроить порт');
    end;
  end else begin
    Memo1.Lines.Add('Не удалось открыть порт');
  end;
end;


end.


Это сообщение отредактировал(а) PriZraK - 2.12.2010, 10:31
PM MAIL ICQ Skype GTalk   Вверх
PriZraK
Дата 4.12.2010, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Для того чтобы заставить печатать данный термопринтер русские буквы, необходимо перепрошить его кириллизованной прошивкой. На данный момент последняя версия 4.06, а новые версии можно искать в данной теме.

В поисках решения печати уже на кириллизованной прошивке, нашёл «OpenSource драйвер терминального принтера Custom VKP80 для Windows и Linux», для меня он стал ориентиром в написании процедуры на дельфи:
Код

procedure WriteCyrillic(Str:String);
var
  i       : Integer;
  s       : AnsiString;
  nWrite  : Cardinal;
begin
  for i := 1 to Length(Str) do begin
    Case Str[i] of
      'А' : s := s + #$80;
      'Б' : s := s + #$81;
      'В' : s := s + #$82;
      'Г' : s := s + #$83;
      'Д' : s := s + #$84;
      'Е' : s := s + #$85;
      'Ж' : s := s + #$86;
      'З' : s := s + #$87;
      'И' : s := s + #$88;
      'Й' : s := s + #$89;
      'К' : s := s + #$8A;
      'Л' : s := s + #$8B;
      'М' : s := s + #$8C;
      'Н' : s := s + #$8D;
      'О' : s := s + #$8E;
      'П' : s := s + #$8F;
      'Р' : s := s + #$90;
      'С' : s := s + #$91;
      'Т' : s := s + #$92;
      'У' : s := s + #$93;
      'Ф' : s := s + #$94;
      'Х' : s := s + #$95;
      'Ц' : s := s + #$96;
      'Ч' : s := s + #$97;
      'Ш' : s := s + #$98;
      'Щ' : s := s + #$99;
      'Ъ' : s := s + #$9A;
      'Ы' : s := s + #$9B;
      'Ь' : s := s + #$9C;
      'Э' : s := s + #$9D;
      'Ю' : s := s + #$9E;
      'Я' : s := s + #$9F;
      'а' : s := s + #$A0;
      'б' : s := s + #$A1;
      'в' : s := s + #$A2;
      'г' : s := s + #$A3;
      'д' : s := s + #$A4;
      'е' : s := s + #$A5;
      'ж' : s := s + #$A6;
      'з' : s := s + #$A7;
      'и' : s := s + #$A8;
      'й' : s := s + #$A9;
      'к' : s := s + #$AA;
      'л' : s := s + #$AB;
      'м' : s := s + #$AC;
      'н' : s := s + #$AD;
      'о' : s := s + #$AE;
      'п' : s := s + #$AF;
      'р' : s := s + #$E0;
      'с' : s := s + #$E1;
      'т' : s := s + #$E2;
      'у' : s := s + #$E3;
      'ф' : s := s + #$E4;
      'х' : s := s + #$E5;
      'ц' : s := s + #$E6;
      'ч' : s := s + #$E7;
      'ш' : s := s + #$E8;
      'щ' : s := s + #$E9;
      'ъ' : s := s + #$EA;
      'ы' : s := s + #$EB;
      'ь' : s := s + #$EC;
      'э' : s := s + #$ED;
      'ю' : s := s + #$EE;
      'я' : s := s + #$EF;
      'Ё' : s := s + #$F0;
      'ё' : s := s + #$F1;
    else
      s := s + Str[i];
    end;
  end;
  WriteFile(ComFile, Pointer(s)^, Length(s), nWrite, nil);
end;

Хочу попросить у сообщества данного форума, помочь упростить данную процедуру, так как она слишком громоздка. 
Исходя из описания к прошивке, в неё добавлена кодовая страница PC866, предполагаю, что кроме букв, можно печатать и иные символы: №, «, » – вот только какой у них байт-код?

Это сообщение отредактировал(а) PriZraK - 6.12.2010, 18:07
PM MAIL ICQ Skype GTalk   Вверх
Denjs
Дата 3.1.2011, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 3.3.2008

Репутация: нет
Всего: нет



Цитата

В поисках решения печати уже на кириллизованной прошивке, нашёл «OpenSource драйвер терминального принтера Custom VKP80 для Windows и Linux», для меня он стал ориентиром в написании процедуры на дельфи:

Смотрите ещё проект OTPD - открытые кроссплатформенные драйвера принтеров чеков. http://developer.berlios.de/projects/otpd/
Там найдите модуль принтера Posiflex PP5200, найдите в модуле обработку печати текста. Все команды с комментариями подробно описаны что и зачем делаается (включая маты на особенностиреализации esc|pos у посифлексов)))) 

http://developer.berlios.de/project/showfi...p?group_id=9484

Если в общем - то вы должны сначала указать притеру кодировку, а потом слать ему данные в заданной кодировке. Но cp1251 большинством принтеров не поддерживается, потому используйте ibm866.
И смотрите документацию на ваш принтер - код русской страницы в разных принтерах отличается друг от друга.

Если что не понятно - спрашивайте - как автор проекта я вам что-нибудь подскажу.




Это сообщение отредактировал(а) Denjs - 3.1.2011, 20:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.