merovirus escreveu:entao li as materias mas nao consegui entender o funcionamento do mesmo, se voce ou alguem tivesse um exemplo de como recebe os dados e depois trata eles para usar no codigo principal
No arquivo que te indiquei, tem um programa em C feito no PIC16F e compilado no CCS.
A rotina de interrupção da serial está abaixo, e faz exatamente o que voce quer.
Repare que a cada byte recebido, os valores da serial é colocado em variaveis especificas.
No caso, o formado do pacote foi bem simples, sem sequer verificação de erro: Tinha de receber 3 caracteres '*' consecutivos para entender que se tratava de um inicio de pacote, e caso um deles fosse diferente disso, o contador "ContBytesRec " ressetava (=0), só retornando a receber após a proxima sequencia de '***'.
Quanto á desabilitar a interrupção, acho completamente desnecessário, basta apenas não fazer nada a cada novo recebimento.
Tomando como exemplo abaixo, poderia forçar a variável
PodeAvaliar para FALSE que nenhum dado recebido seria carregado.
- Código: Selecionar todos
#int_RDA
void RDA_isr( void )
{
if ( kbhit() )
{
DadoRecebido = getc() ;
if ( PodeAvaliar == NAO )
{
switch ( ContBytesRec )
{
case 0 :
if( DadoRecebido == '*') ContBytesRec = 1 ;
else ContBytesRec = 0 ;
break ;
case 1 :
if( DadoRecebido == '*') ContBytesRec = 2 ;
else ContBytesRec = 0 ;
break ;
case 2 :
if( DadoRecebido == '*') ContBytesRec = 3 ;
else ContBytesRec = 0 ;
break ;
case 3 :
ContBytesRec = 4 ;
VerificaSeEhNumeroASCII() ;
TamanhoString_RX = ( DadoRecebido-'0' )*10 ;
break ;
case 4 :
TamanhoString_RX += DadoRecebido-'0' ;
if ( TamanhoString_RX == 0 ) ContBytesRec = 0 ;
else ContBytesRec = 5 ;
VerificaSeEhNumeroASCII() ;
if ( TamanhoString_RX > TAMANHO_MAXIMO_TEXTO )
TamanhoString_RX = TAMANHO_MAXIMO_TEXTO ;
break ;
case 5 :
switch ( DadoRecebido )
{
case '0' : TemEfeito = NAO ; ContBytesRec = 6 ; break ;
case '1' : TemEfeito = SIM ; ContBytesRec = 6 ; break ;
case '2' : ContBytesRec = 100 ; break ;
default : TemEfeito = NAO ; ContBytesRec = 0 ; break ;
}
break ;
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 11 :
case 12 :
case 13 :
case 14 :
case 15 :
case 16 :
case 17 :
case 18 :
case 19 :
case 20 :
case 21 :
case 22 :
case 23 :
case 24 :
case 25 :
case 26 :
case 27 :
case 28 :
case 29 :
case 30 :
case 31 :
case 32 :
case 33 :
case 34 :
case 35 :
case 36 :
case 37 :
case 38 :
case 39 :
case 40 :
case 41 :
case 42 :
case 43 :
case 44 :
case 45 :
case 46 :
case 47 :
case 48 :
case 49 :
case 50 :
case 51 :
case 52 :
case 53 :
case 54 :
case 55 :
case 56 :
case 57 :
case 58 :
case 59 :
case 60 :
case 61 :
case 62 :
case 63 :
case 64 :
case 65 :
case 66 :
case 67 :
case 68 :
case 69 :
case 70 :
case 71 :
case 72 :
case 73 :
case 74 :
case 75 :
case 76 :
case 77 :
if ( TemEfeito )
{
switch ( DadoRecebido )
{
case '0' : Efeitos1[ContBytesRec-6] = 0 ; break ;
case '1' : Efeitos1[ContBytesRec-6] |= BIT0 ; break ;
}
}
else
{
StringToDisplay_RX[ContBytesRec-6] = DadoRecebido ;
}
ContBytesRec++ ;
if ( ContBytesRec > ( TamanhoString_RX + 5 ) )
ContBytesRec = 78 ;
VerificaSeEstaNoMapa() ;
break ;
case 78 :
ContBytesRec = 79 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_0 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_0 ;
else ContBytesRec = 0 ;
break ;
case 79 :
ContBytesRec = 80 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_1 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_1 ;
else ContBytesRec = 0 ;
break ;
case 80 :
ContBytesRec = 81 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_2 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_2 ;
else ContBytesRec = 0 ;
break ;
case 81 :
ContBytesRec = 82 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_3 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_3 ;
else ContBytesRec = 0 ;
break ;
case 82 :
ContBytesRec = 83 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_4 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_4 ;
else ContBytesRec = 0 ;
break ;
case 83 :
ContBytesRec = 84 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_5 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_5 ;
else ContBytesRec = 0 ;
break ;
case 84 :
ContBytesRec = 85 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_6 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_6 ;
else ContBytesRec = 0 ;
break ;
case 85 :
ContBytesRec = 86 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_7 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_7 ;
else ContBytesRec = 0 ;
break ;
case 86 :
ContBytesRec = 87 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_8 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_8 ;
else ContBytesRec = 0 ;
break ;
case 87 :
ContBytesRec = 88 ;
VerificaSeEhNumeroASCII() ;
if ( DadoRecebido == '1' ) TextosValidos |= BIT_9 ;
else if ( DadoRecebido == '0' ) TextosValidos &=~BIT_9 ;
else ContBytesRec = 0 ;
break ;
case 88 :
ContBytesRec = 89 ;
VerificaSeEhNumeroASCII() ;
IndiceTextoRecebido = DadoRecebido - '0' ;
break ;
case 89 :
if( DadoRecebido == '*') ContBytesRec = 90 ;
else ContBytesRec = 0 ;
break ;
case 90 :
if( DadoRecebido == '*') ContBytesRec = 91 ;
else ContBytesRec = 0 ;
break ;
case 91 :
ContBytesRec = 0 ;
PodeAvaliar = SIM ;
break ;
////---------------------------------------------////
case 100 :
Hora_ds1307_digitos = ( DadoRecebido-'0' )<<4 ;
ContBytesRec = 101 ;
VerificaSeEhNumeroASCII() ;
break ;
case 101 :
Hora_ds1307_digitos += DadoRecebido-'0' ;
ContBytesRec = 102 ;
VerificaSeEhNumeroASCII() ;
break ;
case 102 :
Minuto_ds1307_digitos = ( DadoRecebido-'0' )<<4 ;
ContBytesRec = 103 ;
VerificaSeEhNumeroASCII() ;
break ;
case 103 :
Minuto_ds1307_digitos += DadoRecebido-'0' ;
ContBytesRec = 104 ;
VerificaSeEhNumeroASCII() ;
break ;
case 104 :
Dia_ds1307_digitos = ( DadoRecebido-'0' )<<4 ;
ContBytesRec = 105 ;
VerificaSeEhNumeroASCII() ;
break ;
case 105 :
Dia_ds1307_digitos += DadoRecebido-'0' ;
ContBytesRec = 106 ;
VerificaSeEhNumeroASCII() ;
break ;
case 106 :
Mes_ds1307_digitos = ( DadoRecebido-'0' )<<4 ;
ContBytesRec = 107 ;
VerificaSeEhNumeroASCII() ;
break ;
case 107 :
Mes_ds1307_digitos += DadoRecebido-'0' ;
ContBytesRec = 108 ;
VerificaSeEhNumeroASCII() ;
break ;
case 108 :
Ano_ds1307_digitos = ( DadoRecebido-'0' )<<4 ;
ContBytesRec = 109 ;
VerificaSeEhNumeroASCII() ;
break ;
case 109 :
Ano_ds1307_digitos += DadoRecebido-'0' ;
ContBytesRec = 110 ;
VerificaSeEhNumeroASCII() ;
break ;
case 110 :
Semana_ds1307_digitos = DadoRecebido-'0' ;
ContBytesRec = 89 ;
VerificaSeEhNumeroASCII() ;
AlterouCronometro = SIM ;
break ;
default : ContBytesRec = 0 ;
}
}
}
}
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."