Page 1 of 1

Problema al leer puerto com con un lector de tags

Posted: Tue Nov 17, 2009 8:42 pm
by PP1963
Buenas a todos.

Mi proble es el siguiente: Tengo un lector de tags (las tarjetitas de los autobuses) conectado a COM2 que escanea los mismos varias veces cada vez que se pasa. Cuando se pasa, debe leer el codigo y meterlo en una base de datos con un solo campo que recoge la lectura completa.

El codigo que manda es el siguiente: aa00058001b3586801004900020128253db7.

Cuando lo lee, me general dos registros. uno con: a y otro con el resto: a00058001b3586801004900020128253db7

Se que tengo algo mal en el codigo pero no se que es. Adjunto codigo que en la funcion BytesAtPort() es donde recoge los datos del puerto COM2.

Muchas gracias de antemano.

Code: Select all


#include "FiveWin.ch"


function Main()

   local oDlg, nComm := InitComm()

   DEFINE DIALOG oDlg

   oDlg:bCommNotify = { | nComm, nStatus | BytesAtPort( nComm, nStatus ) }

   ACTIVATE DIALOG oDlg ;
      ON INIT EnableCommNotification( nComm, oDlg:hWnd, 20, 20 )

   CloseComm( nComm )

return nil

function InitCOMM()

   local cDcb, nError, nBytes
   local nComm := OpenComm( "COM2", 1024, 128 )

   if ! BuildCommDcb( "COM2:9600,n,8,1", @cDcb )
      MsgStop( "Error BUILD!" )
      return .f.
   endif

   #ifdef __CLIPPER__
      if ! SetCommState( cDcb )
   #else
      if ! SetCommState( nComm, cDcb )
   #endif
      MsgStop( "Error SETCOMM!" )
      return .f.
   endif

return nComm

function BytesAtPort( nComm, nStatus )

   local cBuffer := Space(256)
   local oLeido


   ReadComm( nComm, @cBuffer )

   oLeido:=AllTrim( cBuffer )
   oLeido = STRTRAN( oLeido, CHR( 13 ), "" )
   oLeido = STRTRAN( oLeido, CHR( 10 ), "" )

   msgwait('Esperando mas . . .','',1)

   USE CCHIP
   APPEND BLANK
   REPLACE CCHIP->CHIP WITH oLeido

                                        

return nil

 

Re: Problema al leer puerto com con un lector de tags

Posted: Wed Nov 18, 2009 10:51 am
by karinha
Hola, Cual és la marca del lector, AT&T ??

Saludos.

Re: Problema al leer puerto com con un lector de tags

Posted: Wed Nov 18, 2009 11:29 am
by PP1963
No tiene marca, es un diseño especifico, la lectura es de tags IP-X A 6.8 GH. Lo que necesito es que al pasarlo,independientemente de que lo lea 1 ó 20 veces, que lo coja y lo meta como registro en una base de datos.

Gracias.

Re: Problema al leer puerto com con un lector de tags

Posted: Wed Nov 18, 2009 12:35 pm
by karinha
Hola,

Dificil, podrias muestrar via imagenes, porfa?

Saludos.

Re: Problema al leer puerto com con un lector de tags

Posted: Wed Nov 18, 2009 4:55 pm
by PP1963
Realmente el diseño es como un paquete de tabaco de tamaño y una conexion USB que se instala como puerto serie (COM1, COM2, ETC...). Lo unico que necesito es coger las lecturas que son como he puesto en el primer post y pasarlas a registro, con esto tengo el problema solucionado.

Gracias

José García

Re: Problema al leer puerto com con un lector de tags

Posted: Wed Nov 18, 2009 9:48 pm
by Antonio Linares
Nicolas,

No deberias usar ese MsgWait() ahi.

Debes dejar que te llegue el evento hasta que se complete la longitud de bytes que esperas, algo asi:

Code: Select all

#include "FiveWin.ch"

function Main()

   local oDlg, nComm := InitComm()

   DEFINE DIALOG oDlg

   oDlg:bCommNotify = { | nComm, nStatus | BytesAtPort( nComm, nStatus ) }

   ACTIVATE DIALOG oDlg ;
      ON INIT EnableCommNotification( nComm, oDlg:hWnd, 20, 20 )

   CloseComm( nComm )

return nil

function InitCOMM()

   local cDcb, nError, nBytes
   local nComm := OpenComm( "COM2", 1024, 128 )

   if ! BuildCommDcb( "COM2:9600,n,8,1", @cDcb )
      MsgStop( "Error BUILD!" )
      return .f.
   endif

   #ifdef __CLIPPER__
      if ! SetCommState( cDcb )
   #else
      if ! SetCommState( nComm, cDcb )
   #endif
      MsgStop( "Error SETCOMM!" )
      return .f.
   endif

return nComm

function BytesAtPort( nComm, nStatus )

   local cBuffer := Space( 256 )

   static cLeido := ""

   ReadComm( nComm, @cBuffer )

   cBuffer = StrTran( cBuffer, Chr( 13 ), "" )
   cBuffer = StrTran( cBuffer, Chr( 10 ), "" )
   cLeido += AllTrim( cBuffer )

   if Len( cLeido ) == 36 // Es esta la longitud completa a leer ? 
      USE CCHIP
      APPEND BLANK
      REPLACE CCHIP->CHIP WITH cLeido
      cLeido = ""
   endif
                                       
return nil
 

Re: Problema al leer puerto com con un lector de tags

Posted: Thu Nov 19, 2009 2:04 pm
by PP1963
Funciona perfectamente Antonio.

Muchas gracias y muy agradecido.

José García Nicolás :D :D :D :D