PDA

Ver la Versión Completa : error al comparar caracteres


schdamian
21-08-2010, 16:48:02
Hola a todos, no sabia bien que titulo ponerle a este hilo, el tema es el siguiente, estoy trabajando con impresora fiscal epson lx-300, delphi 2009 y un componente TComPort para escribir y leer el puerto serie. Envio los comandos al puerto serie segun el protocolo Epson, el problema viene al intentar leer la respuesta, todas las respuestas comienzan con el caracter 02 en Hexa (es decir chr($02) ) para lo cual despues de escribir el comando al puerto hago un while de esta forma:


leer_inicio:= '';
while ( leer_inicio <> chr($02) ) do // mientas no lea el comienzo de la respuesta
begin
ComPort1.ReadStr(leer_inicio,1); // leer_inicio es la var donde quiero que guarde lo que lee
// y el param 1 es la cantidad de caracteres que debo leer.
end;
// si estoy aca es porque lei el inicio del comando que me
// envia el controlador fiscal asi que ya puedo leer el resto
// de la respuesta para analizarla



el problema viene a que muchas veces el controlador fiscal responde con otros caracteres que no son el chr($02) y pueden ser el chr($14) chr($12) chr($15) entre otros, y delphi me tirar un error al leer eso caracteres, el error no dice mucho solo tiene un signo de admiracion !, pero se da al leer caracteres y compararlos con chr($02).
por ahora lo solucione parcialmente poniendo un sleep(1000) o 2mil o mas antes de empezar el while para evitar leer esos caracteres y darle tiempo a que llegue un chr($02) el problema es que a veces el controlador fiscal se demora un poco mas en dejar la respuesta en el puerto, he llegado a tener el error hasta haciedo un sleep(7500) en algunos comandos que requieren mas tiempo pero no es la solucion porque a veces el chr($02) aparece en menos de 1 segundo y no puedo esperar 4 o 5 para garantizar la lectura.

si a alguien le se le ocurre algo para darme una mano con este tema, desde ya muchas gracias. Saludos.

Enan0
21-08-2010, 17:53:54
Yo en una epoca trabaje en una empresa (en argentina) que trabajaba con impresores fiscales y con los de matris de puntos (los de carro ancho tipo impresoras) teniamos un problema similar.
al consultarle varias veces el estado.. se solapaban las consultas y el Impresor se colgaba.

como solucion Inclui un Timer en la respuesta. como decis vos.. en 10 segundos aproximadamente.

DAdo que no siempre respondia con la misma rapidez.

Entonces si el impresor estaba ocupado. y se le preguntaba el estado y pasaban pocos segundos.. este respondia y todo seguia perfecto.

El tema es cuando el impresor se demoraba en contestar.. y Plafff..

la DLL del Impresor fiscal moria.

habia que re inicializar TODO..

esa Solucion (talvez no optima) Fue la mejor.

Saludos.

luisdevis
21-08-2010, 22:24:27
No conozco a fondo el Delphi 2009 :cool: pero has de tener cuidado con los bucles del tipo que has indicado, te pueden colgar el sistema. El timer que indica schdamian le da un respiro pero es conveniente por algo parecido a application.processmessages para que el procesador dedique tiempo a otras tareas.

leer_inicio:= '';
while ( leer_inicio <> chr($02) ) do
begin
ComPort1.ReadStr(leer_inicio,1);
application.processmessages;
end;