Go Down

Topic: No consigo leer con serial.read...Ufff... (Read 1 time) previous topic - next topic

Heke

Mar 09, 2010, 04:59 pm Last Edit: Mar 09, 2010, 05:05 pm by Heke Reason: 1
Os comento a ver si podeis ayudarme con algo tan trivial que me da hasta verguenza....

Tengo un arduino rs232 que lo conecto con un modem externo rs232, con el objetivo de mandarle codigos AT (estandar de comunicacion con modems) y obtener su respuesta.

Esto lo tengo conseguido, ademas le añadi el display lcd al primer puerto para poder ver lo que me decia el modem.

Con este codigo de ejemplo le envio un comando AT al modem desde el arduino:    Serial.println("ATI");

El me responde con "56000" que es la configuracion de modem o si le mando:        Serial.println("AT"); el modem me responde con el texto "OK"

Bien, pues con un bucle leo lo que me envia y se lo mando al display para enterarme:
Code: [Select]
void lectura(){
 if (Serial.available()) {
   delay(100);
   char dato= ' ';
   while (Serial.available() > 0) {
     dato=(Serial.read());
     if (dato==13 || dato==10){
        lcd.write(' ');
     }
     else{
     lcd.write(dato);
     }
   }
 }
}


y perfecto, me muestra sus respuestas, pero lo muestra porque estoy en el bucle de ir leyendo la entrada serie continuamente y la lee caracter a caracter.

Y he aqui mi pregunta, porque me vuelvo loco intentando encadenar caracteres a string y demas...:

Podriais orientarme para poder conseguir el objetivo de leer el puerto serie, recibir, por ejemplo la respuesta del modem de: "ok" o "no carrier" y poder compararla para poder decir, si es "ok" vale pero si no ejecutar inicializar modem (por ejemplo) o si es "no carrier" (sin portadora) pues mandarle el texto al display de que no hay linea.

Los comandos AT los controlo, lo que no consigo es un bucle de lo que manda el modem (que puede ser breve de 2 caracteres como el "OK" o puede ser mas largo como "NO CARRIER"

Es que estoy mas perdido... con esto de leer el arduino... solo consigo leer caracter a caracter.

Gracias y un saludo.

PD: El objetivo mio es controlar un modem analogico desde una placa arduino.
CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Igor R

#1
Mar 10, 2010, 11:19 pm Last Edit: Mar 10, 2010, 11:22 pm by igorreal Reason: 1
El lenguaje Arduino (Wiring) usa C/C++ por detrás (AVR Libc)
Puedes utilizar funciones que te ayudarán con tu objetivo:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#g46f3cbd2de457c0fb340a1f379fc33ba

Tienes las típicas funciones de strcmp,strlen,...

Para aprender como funcionan dichas funciones, puedes pasarte por http://www.cplusplus.com .


Saludos  ;)



Igor R.



Heke

#2
Mar 11, 2010, 04:11 pm Last Edit: Mar 11, 2010, 04:12 pm by Heke Reason: 1
Muchas Gracias Igor R

Esos enlaces son una joya, me pongo a estudiarlos ya.

Respecto a mi problema del modem serie y como no se aun encadenar caracteres con string y conseguir comparar strings, he tenido que recurrir a la libreria "string"

No he conseguido que me funcione el ejeplo que trae (copiado integro) de "StringEquals.pde" es como si no reconociera el caracter de intro o retorno de carro porque si en vez de poner "\r" le pongo una "A" si que da por concluida la entrada de datos.

Asi que he probado un ejemplo que trae llamado "StringContains.pde" y este es el que me ha funcionado y me he quitado por un lado el contar caracteres de retorno de carro y avance de linea, simplemente comprueba si en la respuesta existe la palabra que quiero y paso de leer el resto. (es un apaño pero de momento es lo que tengo)

Pongo el ejemplo de codigo que he usado hoy para comprobarlo (esta chapucero pero era una prueba rapida de que funcionara) por si puede ayudar a cuaquier compañero en los mismos berengenales que yo.

Un saludo, continuare...
Code: [Select]
#include <WString.h>                
#include <LiquidCrystal.h>
#define maxLength 30
String inString = String(maxLength);  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 lcd.begin(16, 2);                    // define display de dos columnas
 Serial.begin(9600);                  // define baudios
 pinMode(7, OUTPUT);                  // define retroiluminacion en el 7  
 digitalWrite(7, HIGH);               // enciende retroiluminacion  
 Serial.println("ATZ");               // Reset del modem
 lcd.clear();
 lcd.setCursor(0, 0);
//Regla-Lcd("1..............6" );
 lcd.print("Iniciando Modem " );      // Doy tiempo a que el modem se recupere
 lcd.setCursor(0, 1);
 for (int i=0; i <= 8; i++){
   lcd.print(".");
   delay(700);
  }
 Serial.println("AT&D&S0=4");         // Inicio Dtr y pongo autorespuesta en 4
 Serial.println("ATE0");              // Desactivo mostrar codigos
 Serial.println("ATQ1");              // Desactivo mostrar resultados
}

void loop () {
 while(Serial.available() > 0) {
   getIncomingChars();
 }
 if (inString.contains("NO CARRIER")) {
    lcd.print("SIN PORTADORA");
    limpia();
 }
 if (inString.contains("OK")) {
    lcd.print("OK");
    limpia();
 }
 if (inString.contains("RING")) {
    lcd.print("LLAMANDO");
    limpia();
 }
 if (inString.contains("56000")) {
    lcd.print("VELOCIDAD 56KB");
    limpia();
 }
 if (inString.contains("ERROR")) {
    lcd.print("ERROR");
    limpia();
 }
 inString = " ";
 Serial.flush();
 delay(500);
}

void getIncomingChars() {
 char inChar = Serial.read();
 if (inString.length() < maxLength) {
   inString.append(inChar);
 }
 else {
   inString = inChar;
 }
}

void limpia(){
 delay(500);
 lcd.clear();
}
CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Go Up