FUNCTION crearbcc(p1)
LOCAL bcc,i
bcc = CHR(0)
FOR i = 1 TO LEN(p1)
bcc := charxor(bcc,SUBSTR(p1,i,1))
NEXT
RETURN bcc
FUNCTION abrirport(n)
LOCAL IdPort,cDcb,nError
IdPort := OpenComm("COM"+STR(n,1),1024,256)
IF IdPort <= 0
nError = GetCommError( IdPort)
MsgInfo( "Error al abrir: " + Str( nError ) )
ELSE
MsgRun("Puerto abierto como " + STR(IdPort))
ENDIF
IF ! BuildCommDcb("COM"+STR(n,1)+":9600,n,8,1" , @cDcb)
nError = GetCommError( IdPort)
MsgInfo( "Error al Configurar: " + Str( nError ) )
RETURN 0
ELSE
MsgRun("Puerto Configurado")
ENDIF
IF ! SetCommState( IdPort, cDcb )
nError = GetCommError( IdPort)
MsgInfo( "Error al setear: " + Str( nError ) )
RETURN 0
ELSE
MsgRun("Puerto Seteado")
ENDIF
RETURN IdPort
PROCEDURE mandar(port,string)
LOCAL nBytes
IF (nBytes := WriteComm( port,string) ) < 0
MsgAlert("Mando mal string")
ENDIF
RETURN
FUNCTION leer_ack(port)
LOCAL fallo, ack := " ", nBytes,i := 1
fallo = .t.
DO WHILE .t.
MsgWait("Leyendo Ack ","Espere",.15)
nBytes := ReadComm( port,@ack)
i++
IF i > 20 .or. ack <> " "
EXIT
ENDIF
ENDDO
IF ack <> ""
fallo = .f.
MsgInfo(asc(ack),memvar->musuanom)
ENDIF
RETURN fallo
FUNCTION leer_enq(port)
LOCAL fallo,enq:=" ",nBytes,i := 1
fallo = .t.
DO WHILE .t.
MsgWait("Leyendo Enq","Espere",.3)
nBytes := ReadComm( port,@enq)
i++
IF i > 20 .or. enq <> " "
EXIT
ENDIF
ENDDO
IF enq <> ""
fallo = .f.
MsgInfo(asc(enq),memvar->musuanom)
ENDIF
RETURN fallo
FUNCTION leer_eot(port)
LOCAL fallo,eot := " " ,nBytes,i := 1
fallo = .t.
DO WHILE .t.
MsgWait("Leyendo EoT","Espere",.3)
nBytes := ReadComm( port,@eot)
i++
IF eot = CHR(6)
MsgWait("Esperando por EoT","Espere",5)
LOOP
ENDIF
IF i > 20 .or. eot <> " "
EXIT
ENDIF
ENDDO
IF eot <> ""
fallo = .f.
MsgInfo(asc(eot),memvar->musuanom)
ENDIF
RETURN fallo
PROCEDURE mandar_eot(port)
LOCAL nBytes
*IF ( nBytes := WriteComm( port, "" )) <= 0
IF ( nBytes := WriteComm( port, CHR(4) )) <= 0
MsgAlert("Mando mal EOT")
ENDIF
RETURN
FUNCTION mandar_enq(port)
LOCAL mcont,retorno,nBytes
retorno = .t.
FOR mcont := 1 TO 10
* IF ( nBytes := WriteComm( port, "" )) <= 0
IF ( nBytes := WriteComm( port, CHR(5))) <= 0
MsgAlert("Mando mal ENQ")
retorno := .f.
ELSE
retorno := .t.
EXIT
ENDIF
MsgWait("Enviando datos...","Aguarde",1)
NEXT
RETURN retorno
PROCEDURE mandar_ack(port)
LOCAL nBytes
*IF ( nBytes := WriteComm( port, "" )) <= 0
IF ( nBytes := WriteComm( port, CHR(6))) <= 0
MsgAlert("Mando mal ACK")
ENDIF
RETURN
FUNCTION leer_bloque(port,n)
LOCAL bloque:= SPACE(n),bcc1,nBytes,i:=1
DO WHILE .t.
*MsgWait(bloque,"Espere",.2)
nBytes := ReadComm( port,@bloque)
i++
IF EMPTY(bloque)
MsgWait("Esperando ENQ","Espere",3)
mandar_enq(port)
LOOP
ENDIF
*bloque := IF(EMPTY(bloque),"",bloque)
IF i > 20 .or. bloque <> SPACE(n)
EXIT
ENDIF
ENDDO
bcc1 = crearbcc(SUBSTR(bloque,2,LEN(bloque)-2))
IF RIGHT(bloque,1) <> bcc1 .and. !(""$bloque)
*MsgAlert(OemtoAnsi(bloque),STR(ASC(bcc1))+" <> "+STR(ASC(RIGHT(bloque,1))))
MEMVAR->falla = .t.
ENDIF
RETURN bloque