por andre_luis » 20 Mai 2011 19:51
lellis escreveu:...crie seu proprio getc com mini timeout...
Também sou partidário dessa opinião. Prefiro uma abordagem apenas monitorando o byte recebido quando tiver.
Nunca usei essas funções de entrada ou saída de stream da biblioteca do C. Sempre montei meu manipulador de protocolo manualmente (switch-case).
Assim não trava o processamento num loop de espera.
Aí vai um exemplo :
- Código: Selecionar todos
#int_RDA
RDA_isr()
{
DadoRecebido = getc() ;
TemDado = SIM ;
if ( TemDado )
{
TemDado = NAO ;
switch ( ContBytesRec )
{
case 0 :
PodeAvaliar = 0 ;
BufferRx[ContBytesRec] = DadoRecebido ;
if( DadoRecebido == 'C') ContBytesRec = 1 ;
else ContBytesRec = 0 ;
break ;
case 1 :
BufferRx[ContBytesRec] = DadoRecebido ;
if( DadoRecebido == 'O') ContBytesRec = 2 ;
else ContBytesRec = 0 ;
break ;
case 2 :
BufferRx[ContBytesRec] = DadoRecebido ;
if( DadoRecebido == 'M') ContBytesRec = 3 ;
else ContBytesRec = 0 ;
break ;
case 3 :
case 4 :
BufferRx[ContBytesRec] = DadoRecebido ;
ContBytesRec++ ;
break ;
case 5 :
BufferRx[ContBytesRec] = DadoRecebido ;
if( DadoRecebido == 'F') ContBytesRec = 6 ;
else ContBytesRec = 0 ;
break ;
case 6 :
BufferRx[ContBytesRec] = DadoRecebido ;
if( DadoRecebido == 'I') ContBytesRec = 7 ;
else ContBytesRec = 0 ;
break ;
case 7 :
BufferRx[ContBytesRec] = DadoRecebido ;
if( DadoRecebido == 'N') ContBytesRec = 8 ;
else ContBytesRec = 0 ;
break ;
case 8 :
BufferRx[ContBytesRec] = DadoRecebido ;
ContBytesRec = 9 ;
break ;
case 9 :
BufferRx[ContBytesRec] = DadoRecebido ;
ContBytesRec = 0 ;
PodeAvaliar = 1 ;
break ;
}
}
}
+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."