Timeout da funcao getc()

Enviado:
04 Out 2011 00:19
por aureo.oliveira
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?
Re: Timeout da funcao getc()

Enviado:
04 Out 2011 19:43
por andre_luis
Use a função
kbhit, que verifica se alguma tecla foi acionada :
- Código: Selecionar todos
if(kbhit())
return(getc());
+++

Enviado:
04 Out 2011 21:28
por aureo.oliveira
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.
Re: Timeout da funcao getc()

Enviado:
05 Out 2011 05:11
por andre_luis
aureo.oliveira escreveu:#use rs232(baud=9600,uart1,disable_ints,restart_wdt)
Mas voce desabilitou a interrupção de RDA.
+++

Enviado:
05 Out 2011 08:13
por aureo.oliveira
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.

Enviado:
05 Out 2011 11:12
por ze
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ç

Enviado:
05 Out 2011 15:09
por aureo.oliveira
Boa tarde a todos! Fiz como o Lellis sugeriu e funcionou muito bem, obrigado a todos.

Enviado:
06 Out 2011 00:43
por andre_luis
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.
+++