Page 1 of 1

Como salir de un READCOMM con un timer

PostPosted: Mon Feb 25, 2013 12:07 pm
by JmGarcia
Me encuentro con el problema de que cuando estoy a la espera de un ReadComm(<nComm>,@<cBuffer>) y no se reciben datos por el puerto serie el programa se queda "cuajado".

En TCP se puede usar un INetSetTimeout(<pSocket>,<nMilliSeconds>) para salirse de un INetDGramRecv(<pSocket>,@<cBuffer>,[<nBytes>]) en un ntiempo dado si no se reciben datos.

¿ Alguna idea ?

Re: Como salir de un READCOMM con un timer

PostPosted: Mon Feb 25, 2013 12:48 pm
by karinha
Holá, una duda -> problemas con el idioma.

Cuajado és: Inmóvil, paralizado por el asombro que produce alguna cosa??

Podrias muestrar una imágen?

Saludos.

Re: Como salir de un READCOMM con un timer

PostPosted: Mon Feb 25, 2013 12:56 pm
by karinha
Yo hago asi usando HBCOMM.LIB
Code: Select all  Expand view

FUNCTION FECHA_LEITOR()

   oTimerVendas:Deactivate()

   Fechar_Porta()

RETURN( .T. )

FUNCTION Fechar_Porta()

   Fechar_Leitura()

RETURN NIL

FUNCTION Fechar_Leitura()

RETURN UNINT_PORT(nComm)
 




Re: Como salir de un READCOMM con un timer

PostPosted: Mon Feb 25, 2013 3:01 pm
by Antonio Linares
JM,

Efectivamente la función ReadComm() de FWH entra en un bucle mientras lee y no se contempla un tiempo de espera máximo.

Aqui está corregida. Por favor pruébala y me comentas que tal, gracias

ReadComm(<nComm>,@<cBuffer> [,<nTimeout>] )

Code: Select all  Expand view
short int ReadComm( LPCOMDATA pComm, char far * lpvBuf, short int cbRead, int iMilliSeconds )
{
   short int read;
   clock_t time = clock();

   for( read = 0; read < cbRead && pComm->comtailbuf != pComm->comheadbuf; read++ )
   {
      if( iMilliSeconds && ( ( ( clock() - time ) > iMilliSeconds ) > 60 ) )
        exit;
    
      lpvBuf[ read ] = pComm->combuf[ pComm->comtailbuf ];
      pComm->comtailbuf++;
      if( pComm->comtailbuf > COMBUFSIZE - 1 )
         pComm->comtailbuf = 0;
   }

   return read;
}


y el wrapper para alto nivel:
Code: Select all  Expand view
HB_FUNC( READCOMM ) //  ( nId, @ cBuffer ) --> nBytesRead
{
     #ifndef __FLAT__
      hb_retni( ReadComm( hb_parnl( 1 ), hb_parc( 2 ), hb_parclen( 2 ) ) );
   #else  
      hb_retni( ReadComm( ( LPCOMDATA ) hb_parnl( 1 ), ( char * ) hb_parc( 2 ), ( short int ) hb_parclen( 2 ),
                hb_parnl( 3 ) ) );
   #endif  
}

Re: Como salir de un READCOMM con un timer

PostPosted: Fri Jun 14, 2013 12:33 am
by devtuxtla
Hola Antonio.

Me podrias ayudar para implementar esta solucion del READCOMM en mi programa para xHarbour?

Como lo incluyo para compilarlo ?

Gracias por tu ayuda

Saludos