Tengo un sistema que utiliza una impresora fiscal IBM.
Hasta ahora todo me funciona de la siguiente manera. ( Comandos y estructura resumida a lo mas importante)
Code: Select all
//--------------------------------------------------------------------------- INICIALIZA
Function IF_INICIALIZA()
Local nCom
Local cDcb
nCom:=OPENCOMM( "COM1",1024,256)
IF nCom < 0
MSGALERT("Error de Hardware, Reinicie el Computador","Error Comunicacion" )
Return 0
ENDIF
BUILDCOMMDCB( "COM1:19200,N,8,1", @cDcb )
IF !SETCOMMSTATE( nCom, cDcb )
MSGALERT("Error de Hardware, Reinicie el Computador","Error Inicializacion de Puerto" )
Return 0
ENDIF
RETURN nCom
//---------------------------------------------------------------------------
Function TestdeImpresora()
Local nCom
nCom:=IF_Inicializa()
Define Dialog oDlgCom Resource "OPCION4"
oDlgCom:bCommNotify:={|nCom,nStatus| VerificaCom(nCom,nStatus)}
..................codigo.....................
Activate Dialog oDlgCom on Init EnableCommNotification(nCom,oDlgCom:hWnd,1,-1)
If nCom > 0
CloseComm(nCom)
Endif
RETURN NIL
//--------------------------------------------------------------------------- Estados Impresora
Function VerificaCom(nCom,nStatus )
Local cText:=space(7)
Local nBytes
Local cRes
nBytes:=ReadComm(nCom,@cText)
cRes:=IF_Errores(Substr(cText,1,3))
If cRes<>""
MsgAlert(cRes,"Verifique estado de la Impresora Fiscal " )
Endif
Return .T.
//--------------------------------------------------------------------------- Envia Datos a la Impresora
FUNCTION IF_Envia( nCom, cString )
WRITECOMM( nCom, cString )
RETURN NIL
Hasta ahi todo bien. puedo escribir y ver el estado de la impresora sin problemas, pero en algunas que son mas antiguas, entre cada IF_ENVIA() debo poner un syswait(0.25) para que el comando se envie correctamente. En el caso de documentos con mas de 50 productos, la cosa se pone muy lenta. funciona bien, pero es mas lento que una solucion que tenian en VISUAL BASIc que si le sacaba la velocidad maxima a esas impresoras IBM mas antiguas.
Mi problema radica en como controlo que todo llego bien al impresor una vez enviado el comando.
Urgando encontre este pedazo de PSEUDO CODIGO que entregan a los grandes desarrolladores en un manual ( yo, soy yo y mi sombra.. ja ja).
Asi que si alguno se atreve a ayudarme, tendra mi gratitud.
Este es...
Code: Select all
Envia_Comando(String comando)
String respuesta=""
Char byte=0x00
//se construye comando agregándole inicio frame(87H) y fin frame(88H)
comando=0x87+comando+0x88
// se envía al puerto RS232 byte a byte
Para i=1 hasta largo(comando)
EscribePuerto(mid(comando,i,1))
Fin Para
// se lee desde el puerto RS232 byte a byte
Haga_Mientras(byte <> 0x0D and byte <> 0x0C)
{
byte = LeePuerto() // lee byte a byte
Si (byte==0x0A) Entonces
Break; //ACK(el comando fue satisfactorio)
Sino
respuesta=respuesta+byte //se concatena hasta que llega el fin 0DH(errores,comando 35 y 48) o 0CH(comando 43 en modo descarga)
Fin_Si
}
Fin_Haga_Mientras
FIN Envia_Comando
PD : En las impresoras nuevas, si saco el Syswait(), funcionan bien rapido, pero cada cierto tiempo, se pegan , como si el buffer estuviera saturado o algo asi, como les dije, todo funciona sin problemas, pero no he podido mejorar la velocidad sin poder controlar si el comando esta correcto o nop.
He variado el tamaño del bufer hasta 8192 y na'
Saludos desde CHILE