Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Enviar a OKIPOS 410 cadena de apertura de cajon. I/Oerror, el archivo (LPT1)no existe (https://www.clubdelphi.com/foros/showthread.php?t=73153)

maiquemasque 04-04-2011 08:03:15

Enviar a OKIPOS 410 cadena de apertura de cajon. I/Oerror, el archivo (LPT1)no existe
 
Hola;

No sabía si colocar esto en "Impresión" o "Varios".

Se trata de algo que me tiene ya quemado. No consigo, por más que he buscado y rebuscado en internet, abrir un cajón portamonedas que está conectado con cable RJ11 a una impresora OKIPOS 410.

Cuando intento hacerlo con alguno de los codigos que pongo más abajo, además de darme errores, desconfiguar totalmente las impresoras del sistema, las borra todas de un plumazo. Y esque lo que hace es detenerse el servicio "Cola de impresión". Tengo que activarlo para poder desinstalar la impresora OKI y despues volver a instalarla.

Este es el error que sale en pantalla:

"spooler subsystem app"

"ENUMPRINTERDRIVERS ERROR CODE: 1722"

Y al ejecutar el codigo, tambien aparece a veces esto:

"I/O ERROR 103"

Y además dice que no encontró el archivo.

La impresora está conectada en LPT1 y todo esto es en Windows XP

Y este es el codigo que he utilizado:

Código Delphi [-]
procedure AbreCaja; 
var 
nPrn:TextFile; 
abrir:string; 
begin 
AssignFile(nPrn, 'LPT1'); 
Rewrite(nPrn); 
WriteLn(nPrn,cadena); //cadena:='chr(27)+... dependiendo de la impresora' 
CloseFile(nPrn); 
end;


otro:

Código Delphi [-]
begin 
AssignFile(CajaRegistradora, tTipoCajon); 
Rewrite(CajaRegistradora); 
WriteLn(CajaRegistradora,#27+#112+#0); 
// . WriteLn(CajaRegistradora,#27+#112+#0+#10+#100); 
// . repite la secuencia SI observas que no va correctamente 
CloseFile(CajaRegistradora); 
end;


Código Delphi [-]
procedure AbrirCajon();
var
nPrn: TextFile;
begin
AssignFile(nPrn, 'COM2');
Rewrite(nPrn);
WriteLn(nPrn,#27+#112+#0+#27+#112+#0);
CloseFile(nPrn);
end;

La secuencia para las OKI 410 se supone que es esta:

27,112,0,25,255


Pero ya digo, da igual el codigo que utilice, se va todo el sistema de impresión a la porra.

Con las Epson y Samsung no tuve nunca este problema.

¿Alquien puede ayudarme?, gracias

newtron 04-04-2011 09:10:05

Hola.

Yo mando la cadena a la impresora por su nombre en vez de abrir directamente el puerto y uso este código que te sirve tanto para impresoras locales como para impresoras en red:

Código Delphi [-]
// ****************************************************************************
// Rutina      : AbreElCajon
// Descripcion :
// ****************************************************************************
procedure AbreElCajon(var Impreso: TImpreso);

  function CreaLinea: String;
  var
    sAux: String;
  begin

    Result := '';

    sAux := Trim(DlgPropiedades.ComandoAperturaCajon);
    while Pos(' ', sAux) > 0 do begin

      try
        Result := Result + Chr(StrToInt(Copy(sAux, 1, Pos(' ', sAux)-1)));
      except

      end;

      sAux := TrimLeft(Copy(sAux, Pos(' ', sAux)+1, Length(sAux)));

    end;

    try
      Result := Result + Chr(StrToInt(sAux));
    except

    end;

  end;


  procedure AbreCajonSerie(sPuerto: String);
  var
    Puerto: THandle;
    Cadena: String;
    BytesEscritos: DWord;
  begin

    Cadena := #27 + #8;

    Puerto := CreateFile(PChar(sPuerto),
                         GENERIC_WRITE,
                         0,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);
                         
    WriteFile(Puerto,
              PChar(Cadena)^,
              Length(Cadena),
              BytesEscritos,
              nil);

    CloseHandle(Puerto);
  end;

var
  DocInfo1: TDocInfo1;
  Handle:   THandle;
  Linea:    String;
  N:        DWORD;
begin

  if DlgPropiedades.ImpresoraCajon < 0 then begin
    if DlgPropiedades.ImpresoraCajon = -1 then
      AbreCajonSerie('COM1')
    else if DlgPropiedades.ImpresoraCajon = -2 then
      AbreCajonSerie('COM2');
    Exit;
  end;

  if Printer.Printers.Count = 0 then Exit;


  if Pos(' on', Printer.Printers[Impreso.Impresora]) > 0 then begin
    if not OpenPrinter(PChar(Copy(Printer.Printers[Impreso.Impresora], 1, Pos(' on', Printer.Printers[Impreso.Impresora])-1)), Handle, nil) then begin
      ShowMessage('Error en OpenPrinter : ' + Printer.Printers[Impreso.Impresora]);
      Exit;
    end;

  end else begin
    if not OpenPrinter(PChar(Printer.Printers[Impreso.Impresora]), Handle, nil) then begin
      ShowMessage('Error en OpenPrinter : ' + Printer.Printers[Impreso.Impresora]);
      Exit;
    end;

  end;

  with DocInfo1 do begin
    pDocName    := PChar(Impreso.Nombre);
    pOutputFile := nil;
    pDataType   := 'RAW';
  end;

  StartDocPrinter(Handle, 1, @DocInfo1);

  StartPagePrinter(Handle);

//  Linea := #27 + #112 + #0 + #127 + #127;
  Linea := CreaLinea;
  WritePrinter(Handle, PChar(Linea), Length(Linea), N);

  EndPagePrinter(Handle);

  EndDocPrinter(Handle);

  ClosePrinter(Handle);

end;

newtron 04-04-2011 09:10:56

nada... nada.... que he intentado editar el anterior y me ha creado uno nuevo

lgarcia 04-04-2011 15:04:00

Abrir el cajon
 
hola:

yo use esta unit y la declaro en el formulario y hago el llamado al procedimiento

Código:

unit Escribe_directo;

interface

uses printers, WinProcs, WinTypes, SysUtils;

Procedure Prueba_impresora;

implementation

Type
  Tpasa_datos = Record
  nLong : Integer;
  Datos : Array[0..255] of byte;
end;

Procedure Impresion_directa(s : String);
var
  CadenaB : TPasa_datos;
Begin
  CadenaB.nLong := Length(s);
  StrPCopy(@CadenaB.Datos,s);
  Escape(printer.handle, PASSTHROUGH,0,@CadenaB,nil);
End;

Procedure Prueba_impresora;
Begin
  Printer.BeginDoc;
  Impresion_directa(#27 + 'p0' + #100 + #0 + 'Hello');
  //Impresion_directa(CHR(27)+'&l1O'+'Hello, World!'); // Aqui va el caracter de escape que abre el cajon
  Printer.EndDoc;
End;

end.


Saludos
Luis Garcia


La franja horaria es GMT +2. Ahora son las 04:27:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi