Page 1 of 1

OT : Funciones para Comm

Posted: Tue Sep 18, 2007 4:08 pm
by Vikthor
Saludos a todos.

Alguien me podría explicar como puedo manejar las funciones para puertos Comm

Muchas gracias por adelantado.

Re: OT : Funciones para Comm

Posted: Tue Sep 18, 2007 4:30 pm
by karinha
Vikthor wrote:Saludos a todos.

Alguien me podría explicar como puedo manejar las funciones para puertos Comm

Muchas gracias por adelantado.

USE A HBCOMM.LIB

Re: OT : Funciones para Comm

Posted: Tue Sep 18, 2007 4:35 pm
by jose_murugosa
karinha wrote:
Vikthor wrote:Saludos a todos.

Alguien me podría explicar como puedo manejar las funciones para puertos Comm

Muchas gracias por adelantado.

USE A HBCOMM.LIB
Usando HBComm el tema es que hay que depurar alguna basurilla que aparece en la captura.

Yo lo hago así:

xTara:=Captura(oBtn1)

Funcion captura:

Code: Select all

FUNCTION Captura(oBtn1)
	Local 	tmpbuf := "", cPeso, nPeso, i, TxtCap, ;
				f_Com       := "COM1", ;
   				f_BaudeRate := 9600  , ;
   				f_databits  := 8     , ;
   				f_parity    := 0     , ;
   				f_stopbit   := 1     , ;
   				f_Buff      := 5
  //abro el puerto
  IF !Init_Port( f_Com, f_BaudeRate , f_databits , f_parity ,f_stopbit , f_Buff  )
  	MsgInfo("El Puerto No se ha conectado!","PROBLEMA TECNICO")
  ENDIF
  //Capturo
	FOR I=1 to f_Buff
		txtcap:=InChr(i)
		TxtCap:=SacoBasura( TxtCap )
		TmpBuf+= TxtCap
	NEXT
	//cierro puerto
	UnInt_Port()
	cPeso:=Substr(tmpbuf, At(StrCtrl, tmpbuf), 8)																// aca es donde salteo carater de control
	cPeso:=IF( at( StrCtrl, cPeso )=0, "REPETIR", cPeso)												// \/
	If(cPeso="REPETIR", ( oBtn1:SetFocus(), MsgInfo(cPeso), nPeso:=0 ), npeso:=Val( Substr(cPeso,2,6) ) )
RETURN nPeso
FUNCION depuradora de la captura (para sacar basura)

Code: Select all

Function SacoBasura(cstring)
	local astr:=Array(Len(cstring)), str:="",nstr:=0, i:=0
	for i=1 to len(cstring)
		astr[i]:=Substr(cstring, i, 1)
	NEXT i
	for i=1 to len(cstring)
		if ( Asc(astr[i])>=48 .and. Asc(astr[i])<=57) .or. astr[i]=StrCtrl // .or. astr[i]="+" 
			str+=astr[i]
		endif
	next i
RETURN STR
Puedes obtenerla en el foro de utilidades
http://fivetechsoft.com/forums/viewtopic.php?t=3738
o en mi host:
http://www.box.net/shared/sa6rse88cq

Espero que te sea de utilidad

Re: OT : Funciones para Comm

Posted: Tue Sep 18, 2007 4:49 pm
by Vikthor
Gracias Jose :

La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.

Re: OT : Funciones para Comm

Posted: Tue Sep 18, 2007 5:26 pm
by karinha
Vikthor wrote:Gracias Jose :

La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
http://www.fivewin.com.br/exibedicas.asp?id=606

Re: OT : Funciones para Comm

Posted: Tue Sep 18, 2007 5:37 pm
by Vikthor
karinha wrote:
Vikthor wrote:Gracias Jose :

La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
http://www.fivewin.com.br/exibedicas.asp?id=606

Gracias :)

Posted: Wed Sep 19, 2007 12:48 pm
by cmsoft
Vicktor, tambien podes manejar los comm con las funciones que trae Fivewin sin necesidad de incorporar librerias de 3ros.
Por ejemplo, para abrir el puerto utilizo:

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


Para leer del puerto utilizo:
texto_a_leer := SPACE(10)
nBytes := ReadComm( port,@texto_a_leer)


Para escribir en el puerto utilizo:
nBytes := WriteComm( port,string)

Con estos comandos, he logrado comunicarme con una registrador fiscal, desarrollando el protocolo de la misma sin ningun problema.

Como nota importante, para versiones de Fivewin 2.7 o anterior, Antonio Linares me paso un .obj (COMM.OBJ) que era necesario para que la comunicación funciones sin problemas.
Espero que te sirva la data.
Atte
Cesar

Posted: Wed Sep 19, 2007 1:34 pm
by karinha
cmsoft wrote:Vicktor, tambien podes manejar los comm con las funciones que trae Fivewin sin necesidad de incorporar librerias de 3ros.
Por ejemplo, para abrir el puerto utilizo:

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


Para leer del puerto utilizo:
texto_a_leer := SPACE(10)
nBytes := ReadComm( port,@texto_a_leer)


Para escribir en el puerto utilizo:
nBytes := WriteComm( port,string)

Con estos comandos, he logrado comunicarme con una registrador fiscal, desarrollando el protocolo de la misma sin ningun problema.

Como nota importante, para versiones de Fivewin 2.7 o anterior, Antonio Linares me paso un .obj (COMM.OBJ) que era necesario para que la comunicación funciones sin problemas.
Espero que te sirva la data.
Atte
Cesar
Cesar, Por favor Informe:

Usted con esta funcion, consegue dar lectura en Lectores de Codigos de Barras?

Regards, saludos.

Posted: Wed Sep 19, 2007 2:49 pm
by cmsoft
Hola karinha:
No, la comunicacion es con una registradora fiscal, la cual tiene un protocolo establecido, y por lo tanto, siguiendo dicho protocolo, debo esperar y enviar los comandos y datos apropiados.
Igualmente, para leer codigos de barras, existen los emuladores de teclado, que se encargan de enviar señales de teclado cuando pasa el producto por el scanner. No se que lector tendrás y si el mismo tiene emulador de teclado, pero siempre, para _, la mejor opcion es poner un scanner (lector de codigos de barras) con emulacion.
Espero te sirva la data.
Atte
Cesar

Posted: Wed Sep 19, 2007 4:08 pm
by karinha
cmsoft wrote:Hola karinha:
No, la comunicacion es con una registradora fiscal, la cual tiene un protocolo establecido, y por lo tanto, siguiendo dicho protocolo, debo esperar y enviar los comandos y datos apropiados.
Igualmente, para leer codigos de barras, existen los emuladores de teclado, que se encargan de enviar señales de teclado cuando pasa el producto por el scanner. No se que lector tendrás y si el mismo tiene emulador de teclado, pero siempre, para _, la mejor opcion es poner un scanner (lector de codigos de barras) con emulacion.
Espero te sirva la data.
Atte
Cesar
Gracias César por aclararme la duda.

Acá en Brasil, no és posible. Tengo que usar la HBCOMM.LIB, por sinal, mui buena. Alias, Un excelente trabajo de las personas del proyecto XHARBOUR.

Regards, saludos.

men.. te dejo parte de codigo para accesar al comm

Posted: Thu Sep 20, 2007 12:55 am
by gabo

Code: Select all

/*-----------------------------------------------------------------------------------------------*/
METHOD RecibeDatos() CLASS TAnviz
  LOCAL oGauge, oProgress

  DEFINE DIALOG oGauge RESOURCE "DLG_PROCESO"

  oProgress:= TProgress():Redefine( 1000, oGauge )
  oGauge:bStart   := { || ReadBufferComm(Self, oProgress, oGauge) }
  oGauge:bGotFocus:= { || oProgress:SetFocus() }

  ACTIVATE DIALOG oGauge CENTERED

  RETURN NIL
/*-----------------------------------------------------------------------------------------------*/
STATIC FUNCTION ReadBufferComm( oLector, oBarra, oDialogo )
  LOCAL oDlg, oLbx, oFile, cFechas, cHoras, lGrabalo
  LOCAL hDatos, nBytes, cBuffer, cLinea, aRecords, nRecCount, cHora, cMinu, cSegu
  LOCAL lPrimeraVez, cBuffTemp, nPos, nTotRecords, cLineaAux, nn, cAnio, cMes, cDia, cClave

  hDatos:= OutChr( "("+ oLector:ps_NOSERIE + ",kqdata)"  ) // Envia un comando al puerto comm

  cBuffer:= ""
  nBytes := 200
  cLinea := ""
  aRecords:= {}
  lPrimeraVez:= .T.
  nTotRecords:= 1

  DO WHILE .T.
     cBuffer:= ""
     nBytes := InbufSize()
     IF nBytes > 0
        cBuffer:= InChr( 1000 )
        IF At( "kqdata,ok", cBuffer ) > 0
           IF lPrimeraVez
              cBuffTemp:= cBuffer
              cBuffTemp:= SubStr( cBuffTemp, 1, 22 )
              nRecCount:= Val( SubStr( cBuffTemp, 16, 6 ) )
              lPrimeraVez:= .F.
              oBarra:SetRange( 1, nRecCount )
              oBarra:SetPos( nTotRecords )
              SysRefresh()
           ENDIF
        ENDIF
        IF At( "kqdataend,ok", cBuffer ) > 0
           IF Len( AllTrim( cBuffer ) ) > 0
              cLineaAux:= BufferClean( cBuffer, oBarra, @nTotRecords )
              cLinea+= cLineaAux
           ENDIF
           EXIT
        ELSE
           IF Len( AllTrim( cBuffer ) ) > 0
              cLineaAux:= BufferClean( cBuffer, oBarra, @nTotRecords )
           ENDIF
           cLinea+= cLineaAux
        ENDIF
        SysRefresh()
     ENDIF
  ENDDO

  oDialogo:END()

  oFile:= TTxtFile():New( oLector:cPathDbf  + "checadas.eds" )
  oFile:PutStr( cLinea )
  oFile:Close()

  aRecords:= str2a( cLinea, CRLF )

  FOR nn:= 1 TO Len( aRecords )
      cClave:=SubStr(aRecords[nn],9,4)
      cAnio:= SUBSTR( aRecords[nn], 14, 2 )
      cMes := SUBSTR( aRecords[nn], 16, 2 )
      cDia := SUBSTR( aRecords[nn], 18, 2 )
      cHora:= SUBSTR( aRecords[nn], 21, 2 )
      cMinu:= SUBSTR( aRecords[nn], 23, 2 )
      cSegu:= SUBSTR( aRecords[nn], 25, 2 )

      lGrabalo:= .T.
      cHoras := cHora+":"+cMinu+":"+csegu
      cFechas:= cDia+"/"+cMes+"/"+cAnio
      IF Empty( cHora ) .OR. Empty( cMinu ) .OR. Empty( cSegu ) .OR. Empty( cDia ) .OR. Empty( cMes ) .OR. Empty( cAnio )
         lGrabalo:= .F.
      ENDIF
      IF lGrabalo
         IF AddRecord( "CHECADAS" )
            checadas->CLAVE:= cClave
            checadas->FECHA:= CToD( cFechas )
            checadas->HORA := cHoras
            checadas->( DbUnLock() )
         ENDIF
      ENDIF

  NEXT nn

  RETURN NIL

/*----------------------------------------------------------------------------------------------------*/
STATIC FUNCTION BufferClean( cStrBuff, oBarra, nRecords )
  LOCAL nPos1, nPos2, cStrAuxil, cSTrClean, cChrClean, nn, cChar

  cStrClean:= ""
  DO WHILE Len( AllTrim(cStrBuff) ) > 0
     nPos1:= AT( "(", cStrBuff )
     nPos2:= AT( ")", cStrBuff )
     IF nPos1 > 0
        cStrAuxil:= SubStr( cStrBuff, nPos1, nPos2 )
        cStrAuxil:= StrTran( cStrAuxil, CRLF, "" )
        IF Len( AllTrim( cStrAuxil ) ) = 0
           EXIT
        ENDIF
        cChrClean:= ""
        FOR nn:= 1 TO Len( cStrAuxil )
            cChar:= SubStr( cStrAuxil, nn, 1 )
            IF ( Asc( cChar )>=48 .and. Asc( cChar )<= 57 ) .OR. ;
               ( Asc( cChar )>=97 .and. Asc( cChar )<=122 ) .OR. ;
                 cChar = "(" .OR. cChar = ")" .OR. cChar = ","
                cChrClean+= cChar
            ENDIF
        NEXT
        SysRefresh()
        ++nRecords
        cStrClean+= cChrClean + CRLF
        cStrBuff := SubStr( cStrBuff, nPos2+1 )
        oBarra:SetPos( nRecords )
     ELSE
        EXIT
     ENDIF
     // SysRefresh()
  ENDDO

  RETURN cStrClean

Saludos