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?
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 , 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.
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.