Esta herramienta surgió de la necesidad de comprobar el funcionamiento de impresoras de tickets, es decir, que corta bien, que imprime el logo correcto, etc. Su funcionamiento es realmente simple, se selecciona la impresora, se escribe la secuencia de escape y se pulsa el botón "Enviar". No importa si la impresora es serie, paralelo, usb o es una impresora compartida desde otro equipo, el único requisito es que este instalada, aunque sea como una impresora "Genérica / Solo texto".

Aquí dejo un ejemplo de algunas secuencias de escape (pueden variar de una impresora a otra):
Para que la impresora emita un pitido \x1B@\x0A\x0D\x1B\x07\x0A\x0D Para que corte el papel \x1B@\x0A\x0D\x1Bi\x0A\x0D Para abrir el cajon de monedas \x1B@\x0A\x0D\027\112\000\100\250\x0A\x0D Para que escriba "Hola mundo" \x1B@\x0A\x0DHola mundo\x0A\x0D
Los caracteres especiales se escriben precedidos por el carácter "\" seguido de 3 cifras decimales o de "x" y dos cifras hexadecimales. Así el carácter ESC se escribe "\x1B" o "\027", y el retorno de carro "x0D" o "\013".
El código de este programa, en delphi, es el siguiente:
unit ufrmMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus; type TfrmMain = class(TForm) txtSecuencia: TEdit; cmbPrinters: TComboBox; Label1: TLabel; Enviar: TButton; Label2: TLabel; mnuMain: TPopupMenu; mnuCortar: TMenuItem; mnuCopiar: TMenuItem; mnuPegar: TMenuItem; mnuEliminar: TMenuItem; N1: TMenuItem; mnuSeleccionar: TMenuItem; N2: TMenuItem; mnuDeshacer: TMenuItem; N3: TMenuItem; mnuWindows: TMenuItem; N4: TMenuItem; chkOnTop: TCheckBox; btnMenu: TButton; mnuEnviar: TMenuItem; mnuBucle: TMenuItem; procedure FormCreate(Sender: TObject); procedure EnviarClick(Sender: TObject); procedure mnuDeshacerClick(Sender: TObject); procedure mnuCortarClick(Sender: TObject); procedure mnuCopiarClick(Sender: TObject); procedure mnuPegarClick(Sender: TObject); procedure mnuEliminarClick(Sender: TObject); procedure mnuSeleccionarClick(Sender: TObject); procedure mnuWindowsClick(Sender: TObject); procedure chkOnTopClick(Sender: TObject); procedure btnMenuClick(Sender: TObject); procedure mnuBucleClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; implementation {$R *.dfm} uses Printers, WinSpool, Clipbrd, ufrmBucle; function RawToWindows(Str: String): String; var i: Integer; begin Result:= '<'; while Length(Str) > 0 do begin if Copy(Str, 1, 1) = '\' then begin if Uppercase(Copy(Str, 2, 1)) = 'X' then Str[2]:= '$'; if not TryStrToInt(Copy(Str, 2, 3),i) then Continue; Delete(Str, 1, 3); end else i:= Byte(Str[1]); Delete(Str,1,1); Result:= Result + IntToHex(i,2); end; Result:= Result + '>'; end; function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean; var PrinterHandle: THandle; DocInfo: TDocInfo1; i: Integer; B: Byte; Escritos: DWORD; begin Result:= FALSE; if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then try FillChar(DocInfo,Sizeof(DocInfo),#0); with DocInfo do begin pDocName:= PChar('Printer Test'); pOutputFile:= nil; pDataType:= 'RAW'; end; if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then try if StartPagePrinter(PrinterHandle) then try while Length(Str) > 0 do begin if Copy(Str, 1, 1) = '\' then begin if Uppercase(Copy(Str, 2, 1)) = 'X' then Str[2]:= '$'; if not TryStrToInt(Copy(Str, 2, 3),i) then Exit; B:= Byte(i); Delete(Str, 1, 3); end else B:= Byte(Str[1]); Delete(Str,1,1); WritePrinter(PrinterHandle, @B, 1, Escritos); end; Result:= TRUE; finally EndPagePrinter(PrinterHandle); end; finally EndDocPrinter(PrinterHandle); end; finally ClosePrinter(PrinterHandle); end; end; procedure TfrmMain.btnMenuClick(Sender: TObject); var P: TPoint; begin GetCursorPos(P); mnuMain.Popup(P.X, P.Y); end; procedure TfrmMain.chkOnTopClick(Sender: TObject); begin if chkOnTop.Checked then FormStyle:= fsStayOnTop else FormStyle:= fsNormal; end; procedure TfrmMain.EnviarClick(Sender: TObject); begin if cmbPrinters.ItemIndex >= 0 then begin WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex], txtSecuencia.Text); end; end; procedure TfrmMain.FormCreate(Sender: TObject); begin cmbPrinters.Items.Assign(Printer.Printers); end; procedure TfrmMain.mnuCopiarClick(Sender: TObject); begin txtSecuencia.CopyToClipboard; end; procedure TfrmMain.mnuCortarClick(Sender: TObject); begin txtSecuencia.CutToClipboard; end; procedure TfrmMain.mnuDeshacerClick(Sender: TObject); begin txtSecuencia.Undo; end; procedure TfrmMain.mnuEliminarClick(Sender: TObject); begin txtSecuencia.ClearSelection; end; procedure TfrmMain.mnuPegarClick(Sender: TObject); begin txtSecuencia.PasteFromClipboard; end; procedure TfrmMain.mnuBucleClick(Sender: TObject); begin with TfrmBucle.Create(Self) do try ShowModal; finally Free; end; end; procedure TfrmMain.mnuSeleccionarClick(Sender: TObject); begin txtSecuencia.SelectAll; end; procedure TfrmMain.mnuWindowsClick(Sender: TObject); begin ClipBoard.AsText:= RawToWindows(txtSecuencia.SelText); end; end.
El código lo puedes bajar de aquí, y el programa ya compilado de aquí.
Vaya, tanto tiempo sin
Vaya, tanto tiempo sin escribir nada, se ve que has estado ocupado.
Saluditos.
Que buen aporte... gracias
Que buen aporte... gracias :)
Hey amigo. Me da gusto que
Hey amigo.
Me da gusto que hayas publicado algo mas en esta página :)
Muy intersante forma de imprimir, yo normalmente uso el canvas, así que probaré tu code.
Salud OS
Muchas gracias, es un buen
Muchas gracias, es un buen aporte, yo trabajo mucho con impresoras TM-U de Epson.
Hola! gran trabajo, nos ira
Hola!
gran trabajo, nos ira perfecto para probar las impresoras TM de Epson.
Solo tengo una duda:
intento imprimir un logotipo gráfico previamente grabado en la memoria de la impresora y no lo consigo.
Los codigos ESC que tengo para esto son:
para la EPSON TM-T88, T88II y T88III : 28,112,1,0
para la EPSON TM-T88IV : 29,40,76,6,0,48,69,x,x,1,1 donde x es el numero que sale en el programa de carga del logo.
Saludos.
Yo para Epson tengo la
Yo para Epson tengo la siguiente secuencia:
Como ves solo se diferencia de la tuya en que, en vez de terminar en 0 termina en 30h que se corresponde con el valor ASCII de "0". Ademas he añadido un "retorno de carro" al final, a lo mejor no es necesario pero tampoco hace daño.
En cuanto a la TM-T88IV creo que sirve la misma secuencia que para las demás TM-T88, pruebalo.
Enviar un comentario nuevo