OT : Funciones para Comm

OT : Funciones para Comm

Postby Vikthor » Tue Sep 18, 2007 4:08 pm

Saludos a todos.

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

Muchas gracias por adelantado.
Vikthor
User avatar
Vikthor
 
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Re: OT : Funciones para Comm

Postby karinha » Tue Sep 18, 2007 4:30 pm

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 - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7664
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: OT : Funciones para Comm

Postby jose_murugosa » Tue Sep 18, 2007 4:35 pm

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  Expand view
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  Expand view
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
jose_murugosa
 
Posts: 1169
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: OT : Funciones para Comm

Postby Vikthor » Tue Sep 18, 2007 4:49 pm

Gracias Jose :

La gran duda que tengo , son los valores que devuelve, me podrías dar una breve explicación.
Vikthor
User avatar
Vikthor
 
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Re: OT : Funciones para Comm

Postby karinha » Tue Sep 18, 2007 5:26 pm

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 - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7664
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: OT : Funciones para Comm

Postby Vikthor » Tue Sep 18, 2007 5:37 pm

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
Vikthor
 
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Postby cmsoft » Wed Sep 19, 2007 12:48 pm

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
cmsoft
 
Posts: 1275
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Postby karinha » Wed Sep 19, 2007 1:34 pm

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 - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7664
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby cmsoft » Wed Sep 19, 2007 2:49 pm

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 esos casos, la mejor opcion es poner un scanner (lector de codigos de barras) con emulacion.
Espero te sirva la data.
Atte
Cesar
User avatar
cmsoft
 
Posts: 1275
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Postby karinha » Wed Sep 19, 2007 4:08 pm

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 esos casos, 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 - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7664
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

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

Postby gabo » Thu Sep 20, 2007 12:55 am

Code: Select all  Expand view
/*-----------------------------------------------------------------------------------------------*/
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
gabo
 
Posts: 128
Joined: Tue Jan 03, 2006 8:31 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 88 guests