Ir ao conteúdo
  • Cadastre-se

Travado na função getc


Posts recomendados

Boa tarde!

 

Estou executando o case 'b' quando eu envio o b atraves  do zigbee.

 

Mas gostaria que o programa executasse o default, porém percebi que preciso enviar qualquer caracter exceto o caracter "b".

 

Existe alguma forma de executar a linha do default se eu mandar absolutamente nada.

 

Alguém poderia me dar um dica. Fico aguardando pela ajuda e muito obrigado.

 

 

char dado;

 

  dado = getc();

           switch(dado)

           {

                case 'b':

                            output_high(pin_c0);

                            break;

 

                 default:

                             output_high(pin_c2);

 

           }

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

a getc() geralmente trava mesmo. Ela espera algo da serial. Sem 100% de certeza mas antigamente tinha uma tal de kbhit() ou algo assim que apenas indetificava ser alguma tecla foi pressionada durante a passada por ela. Não sei se ele retorna dado...

 

dado=kbhit();

 

Outra alternativa seria deixar o default por fora

 

dado = getc();if (dado!='b') RC2=1;//output_high(pin_c2);else RC2=0;//output_low(pin_c2);switch(dado)        {          case 'b':                      output_high(pin_c0);                       break;//...//...         }

Ou crie seu proprio getc() com uma alternativa de timeout p.ex. Neste caso terás que dar uma olhadela no d.s. pra acessar os registros da serial


pensando bem... o default por fora dá no mesmo. É melhor você explicar o que exatamente quer fazer pois nem sei se entendi direito

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Obrigado.

 

Estou tentado fazer um semáforo.

No caso Verde para o pedestre e vermelho para o carro.

Em condições normais um pedestre comum atravessaria normalmente.

Já um eficiente visual necessitaria ser auxiliado atraves de um sinal sonoro (buzzer) na sua travessia.

Ele deve solicitar a travessia atraves de um transmissor e a função getc ficaria aguardando b  por exemplo.

Mas no meu código só funciona quando o deficiente esta solicitando.

Com isso para de funcionar para as pessoas sem a deficiência. Pois o código trava na função getc.

 

Fico aguardando...

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

ok 1/2 que entendi. Neste caso a dica que dou é você programar uma interrupção da serial. O programa segue normalmente sua vida com temporizações, luzes e tudo o mais. Ao receber um sinal pela porta serial, ele interrompe o que está fazendo e trata de decidir o que fazer em seguida. você deve dar uma lida no help do compilador e no datasheet do seu mc. Infelizmente não tenho contato com este compilador. Mas não deve ser difícil não. Veja um trecho que fiz em c há algum tempo

void interrupt timer1_e_serial(void){if (TMR1IF)   {   TMR1IF=0;   //etc   }if (RCIF)   {   dado=RCREG   }

e trate dado no loop principal

for(;{//...if (dado='b') façaisso(); //p.ex.//...}
Link para o comentário
Compartilhar em outros sites

Pois é. 

O problema é que fica esperando. 

Tu tem que fazer uma maneira de o getc() só funcionar quando estiver algo entrando na serial.

 

Como tu ta gerando esse caractere pra serial? Tem que ver se esse caractere vai com o EOF (End of file, da uma lida sobre isso)

 

Se o caractere vai com EOF, tu pode usar ele pra acessar o getc() só quando tiver um caractere não nulo (diferente de EOF)

 

Acho que é isso, Isa está aí para me desmentir hahaha

 

Abraço

Link para o comentário
Compartilhar em outros sites

Bom dia!

 

1° teste - O exemplo abaixo funcionou normal sem  o deficiente visual.

2°teste - Em seguida recebeu a solicitação do deficiente, funcionou bem.

3° teste- Em seguida retirei o deficiente da jogada, dessa forma o esperado seria o semáforo funcionar normalmente como no 1° teste.

 

Tenho a impressão que dado guarda o caracter b, tem como zerar o valor de dado?

 

 if(kbhit())

             dado = getch();

 

             if(dado=='b'){                                      //deficiente solicitou auxilio

                     output_high(LD_VM_C);

                     output_high(LD_VD_P);

                    output_high(BUZZER);

                     delay_ms(1000);

                     output_low(BUZZER);

                     }

            if(input(BOT_2)==){          //jumper de solda na placa************funcionamento normal do semaforo

                      output_high(LD_VM_C);

                      output_high(LD_VD_P);

                       delay_ms(1000);

                      }

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Veja no help se kbhit retorna alguma coisa...

Mas  sugiro que você pare de pensar soft e pense um pouco hard. Ou saia do conforto da moleza soft e pegue um pouco mais no pesado hard. Tente receber o dado por interrupção. Simule. Publique o esquema e programa completo.

E ... de novo, de nada!

Link para o comentário
Compartilhar em outros sites

Capturar por interrupção é o mais fácil.

Eu particularmente evito usar interrupções. 

Porque depois a tendência é começar a usar mais interrupções e ter que começar a fazer definições de prioridade.

 

Mas tem muito material na internet disponível sobre a função getc()

 

Mas volto a falar, essa string que tu usa como entrada teria que ter o caractere nulo (/n)

 

Com esse caractere nulo tu conseguiria fazer sem interrupção.

 

Abraço

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Da impressão que a função kbhit deve ser limpa em algum momento...

 

A função "kbhit();" na verdade retorna o estado do bit "RCIF" (que indica se a recepção de um dado terminou, informando assim se há um dado aguardando para ser lido no registrador de entrada)... 
 
Esse bit "RCIF" é zerado por hardware quando o dado é lido do registrador de entrada "RCREG". Assim não é preciso limpar a função "kbhit();" o hardware o faz...
 
>>>>> Isso considerando USART por hardware .
 
É possível postar o esquemático e o código completo?
Link para o comentário
Compartilhar em outros sites

Boa noite!

 

Isadora e Rafael muito obrigado pela atenção e pelo esforço em ajudar.

 

Coloquei o código disponível no link abaixo, tentei colar aqui o código mas este espaço não permite que cole textos.

 

Por favor; me ajudem neste desafio.

 

Clique no link abaixo

https://sites.google.com/site/wiltecsolucoes/

 

Selecione o item abaixo

 

relatório - soluções e conserto de equipamentos eletrônicos

 

Em seguida procure o arquivo em pdf "semáforo para deficiente visual".

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...