OT : Funciones para Comm

Post Reply
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

OT : Funciones para Comm

Post by Vikthor »

Saludos a todos.

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

Muchas gracias por adelantado.
Vikthor
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: OT : Funciones para Comm

Post 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
João Santos - São Paulo - Brasil
User avatar
jose_murugosa
Posts: 943
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay
Contact:

Re: OT : Funciones para Comm

Post 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
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Re: OT : Funciones para Comm

Post by Vikthor »

Gracias Jose :

La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
Vikthor
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: OT : Funciones para Comm

Post 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
João Santos - São Paulo - Brasil
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Re: OT : Funciones para Comm

Post 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 :)
Vikthor
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Post 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
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Post 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.
João Santos - São Paulo - Brasil
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Post 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
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Post 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.
João Santos - São Paulo - Brasil
gabo
Posts: 117
Joined: Tue Jan 03, 2006 8:31 pm

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

Post 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
Post Reply