Lectura de string

Hola a todos! Pretendo hacer un pequeño enredo que consiste en un programa que envie cierta string por el puerto serie y un arduino que la lea, y en funcion de lo que ponga en ella haga una cosa u otra. El problema es que Serial.read() lee un unico byte, asi que lo que pretendo es ir almacenando cada byte hasta que llega el caracter ' ! ', por ejemplo. Los unicos ejemplos que he visto sabian de antemano la longitud de la string, cosa que yo no se pues puede variar, asi que por ahora he hecho este codigo (que no funciona):

int nDato = 0;
char dato;
char Cadena[11];

void LeerSerial() {  
 if (Serial.available()){
  while (Serial.available()>0){
    dato = Serial.read();
      if (dato != ' ! ') {
        Cadena[nDato] = dato;
        nDato++;
      }
      else
        break;
  }
 }
}
 
void setup(){
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}
 
 void loop(){
   LeerSerial();  
   if (Cadena == "encender"){ digitalWrite(13, HIGH);}
  
   delay(1000);
   
 }

Por ahora solo envio la cadena: encender! por el puerto serie, y al recibirla arduino enciende un led, pero esto teoricamente, pues no lo hace.

¿Conoceis alguna manera alternativa de hacer esto? ¿O veis que error puede haber?

Cambia ' ! ' por '!'
Y esto no se puede hacer: Cadena == "encender"

Tienes dos opciones, repasar punteros y vectores o usar objetos String que es más fácil

Yo hice algo similar (función readString()): ArduBus/ardubus.pde at master · chiva/ArduBus · GitHub

Un saludo

intenta no poner un break

:slight_smile:

No entiendo por que dices lo del break

Hola,
creo que tienes que poner a cero nDato cada vez que llames a la función; sino, te irá tomando cada vez valores más altos.
Además, conviene que pongas un carácter '\0' al final de la cadena, porque en C si dejas una cadena sin terminar, te puede ocurrir de todo.

int nDato;
char dato;
char Cadena[11];

void LeerSerial()
{
nDato = 0;
if (Serial.available())
{
while (Serial.available()>0)
{
dato = Serial.read();
if (dato != ' ! ')
{
Cadena[nDato] = dato;
nDato++;
}
else
break;
}
}
Cadena[nDato] = '\0' ;
}

Gracias por la ayuda :smiley: , en base a ese codigo he hecho este:

int nDato;
char dato;
char Cadena[11];

void LeerSerial()
{ 
  nDato = 0;
  if (Serial.available())
  {
      while (Serial.available()>0)
     {
         dato = Serial.read();
         if (dato != '!')
         {
              Cadena[nDato] = dato;
              nDato++;
         }
         else
            break;
      }
  }
 Cadena[nDato] = '\0' ;
}

void setup(){
  Serial.begin(9600);
}

void loop(){
  LeerSerial();
  Serial.println(Cadena);
  delay(1000);
  
  
}

Con el serial monitor del IDE de arduino envio palabras, y las devuelve sin problemas. Ahora la cosa es como comparo esa cadena con otra predefinida, ya que por lo que decis no puedo usar el Cadena == "encender". Podria funcionar comparar la cadena recibida con otra definida? Algo asi como: char encender[9] = "encender" y comparar Cadena con encender. No se si me explico.

Hola,
para eso se usa la función strcmp(), si las cadenas son iguales devuelve cero

if(strcmp(cadena1, cadena1) == 0)
{
   ...
}

Muchas gracias por toda la ayuda, ya funciona perfectamente :D. Por si quereis verlo el codigo ha quedado tal que:

int nDato;
char dato;
char Cadena[11];
char Encender[9] = "encender";
char Apagar[7] = "apagar";

void CompararCadenas(){
  if(strcmp(Cadena, Encender) == 0){
    digitalWrite(13, HIGH);
  }
  
  else if(strcmp(Cadena, Apagar) == 0){
    digitalWrite(13, LOW);
  }
}

void LeerSerial()
{ 
  nDato = 0;
  if (Serial.available())
  {
      while (Serial.available()>0)
     {
         dato = Serial.read();
         if (dato != '!')
         {
              Cadena[nDato] = dato;
              nDato++;
         }
         else
            break;
      }
  }
 Cadena[nDato] = '\0' ;
}

void setup(){
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop(){
  LeerSerial();
  CompararCadenas();
  delay(100); 
  
}

Desde el otro programa, envio la cadena "encender" o "apagar", sin el simbolo " ! ", pero aun asi funciona. Creo que no seria necesario un caracter especifico para indicar fin de cadena, pues el bucle acaba cuando llega el ultimo dato y cierra la cadena.