PDA

Ver la Versión Completa : Enviar a OKIPOS 410 cadena de apertura de cajon. I/Oerror, el archivo (LPT1)no existe


maiquemasque
04-04-2011, 08:03:15
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:

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:

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;



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:


// ****************************************************************************
// 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
hola:

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


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