LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: SJD22 em 12 de Dezembro de 2011, 22:26

Título: Receber resposta comando AT
Enviado por: SJD22 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.
Título: Re: Receber resposta comando AT
Enviado por: zordlyon 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.
Título: Re: Receber resposta comando AT
Enviado por: SJD22 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.
Título: Re: Receber resposta comando AT
Enviado por: zordlyon 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.
Título: Re: Receber resposta comando AT
Enviado por: SJD22 em 13 de Dezembro de 2011, 23:51
Mais sugestões?
Título: Re: Receber resposta comando AT
Enviado por: FCarvalho5555 em 15 de Abril de 2014, 19:56
Podes meter aqui o codigo do teu ciclo while() com o timeout?
Título: Re: Receber resposta comando AT
Enviado por: tarquinio 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.