Timeout da funcao getc()

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Timeout da funcao getc()

Mensagempor aureo.oliveira » 04 Out 2011 00:19

Boa noite a todos! minha rotina no CCS esta funcionando bem, mas preciso configurar o timeout para que o processamento nao fique preso na função getc().

Assim esta funcionando:
#fuses HS,WDT,PUT,NOMCLR,NOBROWNOUT,NOLVP,NOWRT,NOCPD,NOPROTECT
#use delay(xtal=20M,restart_wdt)
#use rs232(baud=9600,uart1,disable_ints,restart_wdt)

quando adiciono "timeout=1000" nao funciona mais, fica preso ate que seja resetado:

#use rs232(baud=9600,uart1,disable_ints,restart_wdt,timeout=1000)

algum colega já usou essa configuração?
HEHEHEHE!!!!!!
aureo.oliveira
Bit
 
Mensagens: 27
Registrado em: 11 Out 2006 19:28
Localização: Goiânia-Goiás

Re: Timeout da funcao getc()

Mensagempor andre_luis » 04 Out 2011 19:43

Use a função kbhit, que verifica se alguma tecla foi acionada :

Código: Selecionar todos
   if(kbhit())
      return(getc());



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor aureo.oliveira » 04 Out 2011 21:28

Estou usando a interrupção INT_RDA, que fica bem parecido com KBHIT(), ou seja quando vier um carácter entra em loop ate receber um "enter".

cpp code
#INT_RDA
void Service_RDA()
{
int max=9;
char* s=Command;
int len=0;
char c;
--max;
do {
c=getc();
if ((c>=' ')&&(c<='~'))
{
if(len<max)
s[len++]=c;
}
} while(c!=13 && c!=0 && rs232_errors!=0);
s[len]=0;
}//Service_RDA()


Eu esperava que a configuração Timeout=1000 quebrasse o getc(), se passar mais de um segundo sem chegar carácteres , então o loop seria quebrado com c==0 ou rs232_errors == 0.
HEHEHEHE!!!!!!
aureo.oliveira
Bit
 
Mensagens: 27
Registrado em: 11 Out 2006 19:28
Localização: Goiânia-Goiás

Re: Timeout da funcao getc()

Mensagempor andre_luis » 05 Out 2011 05:11

aureo.oliveira escreveu:#use rs232(baud=9600,uart1,disable_ints,restart_wdt)


Mas voce desabilitou a interrupção de RDA.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor aureo.oliveira » 05 Out 2011 08:13

A configuração "disable_ints" desabilita global após atender a RDA, para outras funções não coromper a string que esta chegando ou saindo.
HEHEHEHE!!!!!!
aureo.oliveira
Bit
 
Mensagens: 27
Registrado em: 11 Out 2006 19:28
Localização: Goiânia-Goiás

Mensagempor ze » 05 Out 2011 11:12

crie seu próprio getc com timeout. vai ter que sujar as mãos e conhecer o âmago (registros) do MC. Se não voce precisa de outro tipo de ajuda mais limpa. to fora.
Código: Selecionar todos
char seupropriogetccomtimeout()
{
unsigned int tmout=1000;//veja se o tempo ...
while(!RCIF && (tmout--);//...desta iteração serve
RCIF=0;
if (tmout) return RCREG;//dado ok
else return 0;//0=timeout
}
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor aureo.oliveira » 05 Out 2011 15:09

Boa tarde a todos! Fiz como o Lellis sugeriu e funcionou muito bem, obrigado a todos.
HEHEHEHE!!!!!!
aureo.oliveira
Bit
 
Mensagens: 27
Registrado em: 11 Out 2006 19:28
Localização: Goiânia-Goiás

Mensagempor andre_luis » 06 Out 2011 00:43

O ideal seria implementar o controle de timeout temporizado por interrupção de timer, caso contrário o programa estará constantemente passando por esse loop fechado.
Mas se atende, tá oótimo.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

x