Function Comunica(nTieEsp)
Local XPortId, cBloque, cbloque2
LOCAL nNroPue := CAJ->nSerEn1Caj // 7
LOCAL nVelTra := CAJ->nSerEn2Caj // 9600
LOCAL cTipPar := CAJ->cSerEn3Caj // "N"
LOCAL nLonDat := CAJ->nSerEn4Caj // 8
LOCAL nBitPar := CAJ->nSerEn5Caj // 1
LOCAL nLonPic := CAJ->nSerEn6Caj // 15
LOCAL cSarSub := CAJ->cSarSubCaj
LOCAL cOrdSar := CAJ->cSarRevCaj
LOCAL X := 0, Y := 0 , nPosGui := 0
IF !EMPTY(cSarSub) //'18,5' o vacio
nPosGui := ATNUM(',',cSarSub,1)
cSarSub := ALLTRIM(cSarSub)
IF nPosGui > 0
X := VAL(ALLTRIM(SUBS(cSarSub,1,nPosGui-1)))
Y := VAL(ALLTRIM(SUBS(cSarSub,nPosGui+1)))
ENDIF
ENDIF
xPortId := abrirport(nTieEsp,nNroPue,nVelTra,cTipPar,nLonDat,nBitPar)
IF (XPortId <= 0 )
CloseComm(XPortId)
RETURN "0"
ENDIF
MySleep(nTieEsp)
cbloque = leer_bloque(XPortId,nLonPic,X,Y,cOrdSar,nTieEsp)
if FlushComm( XPortId, 0 ) != 0
nError = GetCommError( XPortId )
MsgInfo( "FlushComm Error: " + Str( nError ) )
endif
if ! CloseComm( XPortId )
nError = GetCommError( XPortId )
MsgInfo( "CloseComm Error: " + Str( nError ) )
endif
RETURN cBloque
//**************************************************************
STATIC FUNCTION abrirport(nTieEsp,nNroPue,nVelTra,cTipPar,nLonDat,nBitPar)
LOCAL IdPort := 0, oErr
LOCAL cDcb, nError := 0
LOCAL sarta := "COM"+STR(nNroPue,1)+":"+ALLTRIM(STR(nVelTra,5))+","+cTipPar+","+STR(nLonDat,1)+","+STR(nBitPar,1)
IdPort := OpenComm("COM"+STR(nNroPue,1), 1024,128) //,2048,512
if FlushComm( IdPort, 0 ) != 0
nError = GetCommError( IdPort )
MsgInfo( "FlushComm Error: " + Str( nError ) )
endif
IF IdPort <= 0
nError = GetCommError( IdPort)
MsgInfo( "Error al abrir: " + Str( nError ) )
RETURN 0
ELSE
//MsgRun("Puerto abierto como " + STR(IdPort))
ENDIF
MySleep(nTieEsp)
IF ! BuildCommDcb(sarta, @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
//***************************
STATIC FUNCTION leer_bloque(port,n,x,y,cOrdSar,nTieEsp)
LOCAL bloque:= SPACE(n),bcc1,nBytes,i:=1, NLONSAR := 0
local cNueSar := '' , cCarLei := "" , SW_NUMBER := 0 , sw := 0
LOCAL cSarNum := "", J:= 0 , nPosIni := 0, II := 0 , nError := 0
mandar_enq(port,64)
DO WHILE .T. .AND. I < 20
i++
nBytes := ReadComm( port,@bloque)
nError = GetCommError( port )
IF nError > 0
MsgInfo( "ReadComm Error: " + Str( nError ) )
ENDIF
MySleep(nTieEsp)
IF ASC(alltrim(bloque)) == 6
//MsgWait("Esperando ENQ 6","Espere",1)
//bloque := SPACE(31)
mandar_enq(port,17)
LOOP
ENDIF
IF EMPTY(alltrim(bloque))
//MsgWait("Esperando ENQ","Espere",1)
mandar_enq(port,5)
LOOP
ENDIF
IF i > 20 .or. LEN(alltrim(bloque)) == n // 15
EXIT
ENDIF
ENDDO
bloque := ALLTRIM(bloque)
IF PARAMETRO(200)
FOR J := 1 TO LEN(bloque)
IF SUBS(bloque,J,1) $ "0123456789."
IF II == 0
nPosIni := J
II := 9999
ENDIF
cSarNum += SUBS(bloque,J,1)
ENDIF
NEXT J
ALERTA("SARTA LEIDA : "+bloque + CRLF + ;
"LONGITUD SARTA : " + STR( LEN(ALLTRIM(bloque)),2)+ CRLF + ;
"PESO HALLADO : " + cSarNum+ CRLF + ;
"POSICION DEL PESO : "+str(nPosIni+1,10) )
ENDIF
IF !EMPTY(cOrdSar) // TIPO DE BASCULA LEXUS
IF UPPER(cOrdSar) == "S" // orden contrario si // OJO SE ASUME QUE SOLO VIENE UNA SARTA DE NUMEROS ??
nLonSar := LEN(ALLTRIM(bloque))
cNueSar := ''
SW := 0
SW_NUMBER := 0
cOrdSar := "S"
cValLei := bloque
I := 1
DO WHILE I <= nLonSar
J := nLonSar
cCarLei := SUBS(cValLei,J,1)
IF cCarLei $ '0123456789.'
SW_NUMBER := 1
cNueSar += cCarLei
ELSE // ENCONTRO UN CARACTER NO VLIDO
IF SW_NUMBER == 1 // YA HABIA ENCONTADO UN NUMERO
SW := 0
EXIT // NO LEE MAS YA TERMINO LA SARTA DE NUMERO
ENDIF
ENDIF
IF PARAMETRO(200) // para analizar lectura, en pruebas
ALERTA("SARTA : "+cNueSar+" CON CARACTER = "+cCarLei)
ENDIF
--nLonSar
ENDDO
ELSE // ORDEN NORMAL
nLonSar := LEN(ALLTRIM(bloque))
cNueSar := ''
SW := 0
SW_NUMBER := 0
cValLei := bloque
FOR I := 1 TO nLonSar
cCarLei := SUBS(cValLei,I,1)
IF cCarLei $ '0123456789.'
cNueSar += cCarLei
SW_NUMBER := 1
ELSE
IF SW_NUMBER == 1 // YA HABIA ENCONTADO UN NUMERO
SW := 0
EXIT // NO LEE MAS YA TERMINO LA SARTA DE NUMERO
ENDIF
ENDIF
IF PARAMETRO(200) // para analizar lectura, en pruebas
ALERTA("SARTA : "+cNueSar+" CON CARACTER = "+cCarLei)
ENDIF
NEXT I
ENDIF
bloque := cNueSar
ENDIF
IF X > 0
bloque := SUBS(bloque,X,Y)
ELSE
nPosGui := ATNUM('.',bloque,1)
IF nPosGui > 0
bloque := SUBS(bloque,nPosGui)
ENDIF
ENDIF
IF PARAMETRO(200)
ALERTA(BLOQUE)
ENDIF
RETURN bloque // subs(bloque,nPosIni+1,Y) // subs(bloque,X,Y)
//******************************************************************
STATIC FUNCTION mandar_enq(port,nchar)
LOCAL mcont,retorno,nBytes, IX := 0
retorno = .t.
//CHR(nchar)
FOR mcont := 1 TO 10
IF ( nBytes := WriteComm( port, CHR(nchar) )) <= 0
MsgAlert("Mando mal ENQ")
retorno := .f.
ELSE
retorno := .t.
EXIT
ENDIF
//MsgWait("Enviando datos...","Espere ...",3)
MySleep( 10 )
NEXT
RETURN retorno
//****************************************************