2015-07-26 3 views
1

Я использую этот код, чтобы напечатать текстовый файл POS принтера (EPSON):Как отправить команды управления ККМ из Delphi

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, но я не знаю, как отправить их на принтер. Может ли кто-нибудь написать пример?

Thank you.

+0

Отправьте их точно так же, как вы здесь. Хотя лично я бы предпочел не использовать устаревший I/O Pascal. На самом деле у меня создается впечатление, что вы только что скопировали этот код и не понимаете, как это работает. Я подозреваю, что, потому что вы просите нас написать код для вас, а не помочь вам понять. Потратьте некоторое время, чтобы понять, что делает этот код. Тогда вы поймете, что отправка командных кодов одинакова. –

+0

Да, вы правы, я не совсем понимаю этот код, и я попытался использовать тот же код для отправки команд в pirnter, но без везения. И что вы рекомендуете использовать вместо «устаревшего ввода/вывода Pascal»? – Mindaugas

+0

Я предлагаю вам попытаться понять, что вы делаете. На первый взгляд кажется, что вы еще не знаете, что делаете, не понимаете этот код и просите нас написать свой код для вас. Это не то, для чего предназначен этот сайт. –

ответ

1

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

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, вы можете обрабатывать возвращаемое значение от принтера в случае ошибок, таких как «Конец бумаги», «Принтер OffLine» и т. Д.

+0

Большое спасибо за помощь. – Mindaugas

0

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

Определение команды CUT:

//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 код here

+1

Лучше надеюсь, что пользователь не использует Unicode Delphi. Строки здесь не кажутся хорошей идеей. –

+0

Я начал использовать модуль PrtRaw и может печатать текст или отправлять некоторые команды на принтер (# 10 или # 13), но принтер не принимает команду вырезания в любом формате (# 29 # 86 # 0, # 29 # 66 # 0 , # 29'V '# 66 # 0 и т. Д.). – Mindaugas

Смежные вопросы