Buen día...
Anexo código que funciona....
Pero realmente poco la uso, dado que termine haciéndolo con java, que es mas rápida, me sirve para cualquier bascula, me sirve para conexiones de terminal server.
Code: Select all
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
//****************************************************