collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Receber resposta comando AT  (Lida 3022 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Receber resposta comando AT
« em: 12 de Dezembro de 2011, 22:26 »
Estou aqui de volta de uma questão interessante sobre comandos AT.

Estou a enviar comandos AT para o meu modulo GM862 e depois aguardo a resposta dele. Basicamente envio uma string ("AT+CSQ" por exemplo) e depois tenho um ciclo while que está sempre a ver se existem dados disponiveis (método available()) e se sim faço um read(). Vou juntando todos os bytes recebidos numa string. A guarda do ciclo while é a verificação se a string total acaba em OK ou ERROR.

Eu nao vejo outra maneira de fazer isto... mas é possivel que exista. No entanto, isto traz-me um problema que ja me aconteceu algumas vezes (mais do que eu gostaria). As vezes o processador, por qq razao, recebe um caracter errado... e se isso calha no OK ou no ERROR lá se vai a guarda do ciclo while e o processador fica ali eternamente a correr dentro do while. Soluçoes? Eu arranjei uma que foi meter um timeout. Ou seja, se o while correr mais do que 120 segundos, por exemplo, ele faz um break e salta fora do while.

Existe melhor maneira de receber os dados por Serial e processá-los?

Obg.

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
Re: Receber resposta comando AT
« Responder #1 em: 13 de Dezembro de 2011, 10:02 »
A ver se percebi então, Supondo a String "ERROR",  basicamente tu mandas caracter a caracter, e vai juntando os caracteres todos numa string até ela ficar completa certo?, mas tens o problema de por receber ali um "Z" que não existe na string "ERROR" e já dá te cabo do esquema ne?!...

Penso que o que podes fazer é o seguinte, tens 1 String aulixiar com a palavra que queres receber, neste caso "ERROR", e depois dependendo do caracter que recebes comparas com a String que já tens previamente definida, e se receberes um caracter que não conste nessa string, basta descarta-la...
Mais ou menos isto:

Código: [Seleccione]
String[4]= ERROR
While(){
(...)
   For(x=0;x<string.lenght;x++){

        if (caracter_recebido != string[x]){
           descarta_caracter;
        }else{
           guarda_carcater
        }
   }
(...)
}


Pelo que percebi deve ser mais ou menos isto que queres, não sei é se esta solução te serve, peço desculpa pelo "Pseudo-C" lol..

Cumprimentos,
André Carvalho.
« Última modificação: 13 de Dezembro de 2011, 10:04 por zordlyon »
Cumprimentos,
André Carvalho.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: Receber resposta comando AT
« Responder #2 em: 13 de Dezembro de 2011, 11:09 »
Da forma como sugeres e para o caso do ERROR eu nem chegaria a receber o que vem antes do ERROR então, no fundo a resposta do comando AT. Porque estaria sempre a comparar tudo com a palavra ERROR.

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
Re: Receber resposta comando AT
« Responder #3 em: 13 de Dezembro de 2011, 14:59 »
Sim obviamente, mas dentro do ciclo for, bastava teres comparações para as diferentes strings que queres...e as diferentes strings guardavas numa matriz... do genero:

Matriz Pre-definida

   0 1 2 3 4
0 E R R O R
1 O K
2 O L A

E depois por exemplo no caso do "O"...

fazias o IF para comparar Linha a linha, caracter a caracter, quando encontra-se um "O", basicamente guardavas esse "O" noutra matriz auxiliar na posição onde a comparas-tee ias formando as palavras.

Supondo que ao comparar com "ERROR" tinhas a letra na posição x=0, y=3, na matriz auxiliar irias por o "O" nessa posição, e para as restantes palavras igual, caso encontrasses esse caracter na matriz, e ficava-te do genero:

Matriz Auxiliar

   0 1 2 3 4
0 _ _ _ O _
1 O _
2 O _ _

Agora recebias outro caracter e caso o encontra-sses na matriz predefinida ias preencher novamente a matriz auxiliar naquela posição...

Assim a primeira vista foi o que me veio a cabeça... ;)

Cumprimentos,
André Carvalho.
Cumprimentos,
André Carvalho.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: Receber resposta comando AT
« Responder #4 em: 13 de Dezembro de 2011, 23:51 »
Mais sugestões?

Offline FCarvalho5555

  • Mini Robot
  • *
  • Mensagens: 42
Re: Receber resposta comando AT
« Responder #5 em: 15 de Abril de 2014, 19:56 »
Podes meter aqui o codigo do teu ciclo while() com o timeout?

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Receber resposta comando AT
« Responder #6 em: 15 de Abril de 2014, 20:47 »
As vezes o processador, por qq razao, recebe um caracter errado... e se isso calha no OK ou no ERROR lá se vai a guarda do ciclo while e o processador fica ali eternamente a correr dentro do while.

Não percebi bem se o que acontece é receberes um caractere a mais, ou um trocado... Penso que seja trocado mas podes confirmar? Recebes por exemplo "ERRXR" ou "ERRXOR"?

Se recebes o caractere trocado é complicado fazer a coisa sem timeouts... Não sei que dados é que estás a receber, mas se calhas podias fazer o timeout baseado na ultima altura que recebeste dados, em vez de ser na altura em que o while comecou.