Ir ao conteúdo
  • Cadastre-se
WILTECSOLUCOES

Travado na função getc

Recommended Posts

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);

 

           }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo.

Vou lhe sugerir uma coisa (pois também estou aprendendo a brincar com serial):

 

Cria uma rotina (só para teste) para ler o que fica entrando na serial quando nada é enviado. 

Daí tenta usar isso no teu switch

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.//...}

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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);

                      }

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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?

Compartilhar este post


Link para o post
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".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×