Как отправлять команды управления на POS-принтер из Delphi

Я использую этот код для печати текстового файла на POS-принтере (EPSON):

   AssignFile(prnfile, 'file.txt');
   Reset(prnfile, 1);
   AssignFile(port, 'COM3');
   Rewrite(port, 1);
   repeat
     BlockRead(prnfile, buffer, SizeOf(buffer), Read);
     BlockWrite(port, buffer, Read);
   until EOF(prnfile) or (Read <> SizeOf(buffer));
     CloseFile(prnfile);
     CloseFile(port);

Текст напечатан, но мне нужно вырезать чек. У меня есть коды команд EPSON, но я не знаю, как отправить их на принтер. Кто-нибудь может написать пример?

Спасибо.


person Mindaugas    schedule 26.07.2015    source источник
comment
Отправляйте их точно так же, как вы делаете здесь. Хотя лично я бы предпочел не использовать устаревший ввод-вывод Pascal. На самом деле у меня такое впечатление, что вы только что скопировали этот код и не понимаете, как он работает. Я подозреваю, что это потому, что вы просите нас написать для вас код, а не помогать вам разобраться. Найдите время, чтобы понять, что делает этот код. Тогда вы поймете, что отправка кодов команд - это то же самое.   -  person David Heffernan    schedule 26.07.2015
comment
Да, вы правы, я не совсем понимаю этот код и пытался использовать тот же код для отправки команд в пирнтер, но безуспешно. И что вы рекомендуете использовать вместо устаревшего ввода-вывода Pascal?   -  person Mindaugas    schedule 26.07.2015
comment
Я предлагаю вам попытаться понять, что вы делаете. На первый взгляд может показаться, что вы еще не знаете, что делаете, не понимаете этот код и просите нас написать ваш код для вас. Этот сайт не для этого.   -  person David Heffernan    schedule 26.07.2015


Ответы (2)


Я много пробовал и, наконец, написал этот код, который работает:

procedure Cut();
 var epsonprn : System.Text;
begin
 try
   AssignFile(epsonprn,'COM3');// the name of printer port, can be a network share
   Rewrite(epsonprn);
   Write(epsonprn,#29#86#66#0);//cut sequence
 finally
   CloseFile(epsonprn);
 end;
end;

так что решение:

procedure TForm1.Button1Click(Sender: TObject);
 var prnfile,port:System.Text;
 var buffer:String;
begin
  try
    AssignFile(prnfile, 'c:\file.txt');
    Reset(prnfile);
    AssignFile(port, 'COM3');
    Rewrite(port);

    while not eof(prnfile) do
      begin
        Readln(prnfile, buffer);
        Writeln(port, buffer);
      end;

   finally
     CloseFile(port);
     CloseFile(prnfile);
   end;

   cut();
end;

В любом случае, я предлагаю использовать компонент tComPort вместо прямого использования Writeln. Используя tComPort, вы можете обрабатывать значение, возвращаемое принтером, в случае таких ошибок, как «Конец бумаги», «Принтер отключен» и т. Д.

person Gianluca Colombo    schedule 27.07.2015
comment
Большое спасибо за Вашу помощь. - person Mindaugas; 28.07.2015

Вы должны отправить последовательность ESC / POS, подобную этой

Определение команды вырезания:

//ASCII   GS V  m
//Hex     1D 42 m
//Decimal 29 66 m


var cut:String;
begin  
  cut:=Chr(29)+'V'+Chr(66)+Chr(0);
// send this sequence direct to com after the text file
end;

полный код esc / pos здесь

person Gianluca Colombo    schedule 26.07.2015
comment
Лучше надеяться, что пользователь не использует Unicode Delphi. Струны здесь не кажутся хорошей идеей. - person David Heffernan; 26.07.2015
comment
Я начал использовать модуль PrtRaw и могу печатать текст или отправлять некоторые команды на принтер (# 10 или # 13), но принтер не принимает команду вырезания в любом формате (# 29 # 86 # 0, # 29 # 66 # 0, # 29'V '# 66 # 0 и т. Д.). - person Mindaugas; 27.07.2015