Problema con serial.read en aplicación bluetooth[Solucionado]

Hola a todo:
Estoy jugando un poco con una aplicación desde el movil al arduino, por bluetooth. Tengo un arduino Mega, el cual tiene varios puertos serie. El modulo bluetooth ocupa el serial uno. Quiero sabes que caracter le llega a arduino desde el movil y es ahí donde tengo el problema. Desde el movil hice una app que manda una a para encender y una b para apagar. Cuando abro el terminal serie desde el ordenador me sale un caracter raro ÿÿÿÿÿÿÿÿÿ, siempre asi hasta que pulso el botón del movil que si me sale la a o cuando lo apago que me sale la b. Sino pulso nada me sale esa cadena rara de caracteres. Leyendo encontré que es algo asi como que como no le llega nada eso es lo que imprime. No se si esto es muy fiable, pero no se como quitarlo, una ayudita...

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

}

void loop()
{
 
  char c = Serial1.read();
  
  if (c == 'a') digitalWrite(13,HIGH);
  if (c == 'b') digitalWrite(13,LOW);
 
Serial.print(c);  
 
  delay(1000);
}

Hola a todos:
Creo que el problema es que ÿ equivale a un -1 en decimal, lo que quiere decir que la memoria del Serial esta vacía. Como a y b en DEC son 97 y 98, le pongo un condiciona que sólo me imprima digitos mayores de cero. Ahora me funciona a la perfección, tener cuidado como se define la variable es decir char o int, ya que el serial.print lo tomará de distinta manera. Os dejo el código

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

}

void loop()
{
 char  c = Serial1.read();  
  if (c == 'a'){ digitalWrite(13,HIGH);}
  if (c == 'b') {digitalWrite(13,LOW);}
  
   if (c>='0' ) {
    Serial.print(c); 
    //en este caso como definimos la variable como char, no imprime un caracter. 
   // si la huviesemos definido como int, nos imprimiria el número decimal. Serial.print(c,byte()); para convertirlo a digito. 
   }
  delay(500);
    
}

Si alguién tiene algún aporte más o corrección, que comente.
Espero que os sirva.

Hola. Quizás hubiera sido más correcto englobar tu rutina de recepción en una instrucción if(Serial1.available), pues estás "obligando al arduino a que te devuelva un dato aunque no se haya recibido.

Saludos

Buenas noter:
Tienes razón (como siempre jeje), hice un poco más elegante el código, lo dejo por aquí por compartir.

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

}

void loop()
{
  char  c;
  if (Serial1.available()){                 //para que solo lo lea cuando haya datos, como dice noter
    c = Serial1.read(); 
  }
  switch (c){
    case 'a':
         digitalWrite(13,HIGH);
         break;
    case 'b':
          digitalWrite(13,LOW);
          break;
  }
   if (c>='0' ) {
    Serial.print(c); 
    //en este caso como definimos la variable como char, no imprime un caracter. 
   // si la huviesemos definido como int, nos imprimiria el número decimal. Serial.print(c,byte()); para convertirlo a digito. 
   }
  delay(500);
}

Ahora me pregunto, y si quiero hacer un pulsador. Es decir, cuando ponga el dedo en el botón de la pantalla del movil, se activa una salida, cuando deje de poner el dedo se desactive.¿alguna idea por ahi?

Gracias.

Entiendo que me estás preguntando sobre la aplicación del móvil, pues parece evidente que lo que debería hacer la aplicación es enviar por serial un dato cuando se detecta la pulsación y enviar otro dato cuando se detecte el cese de pulsación.
No sé con qué estás programando tu aplicación en el móvil y, sinceramente, no me he metido (aún) a programar en android, pero típicamente lo que tendrás que hacer es "interceptar" el evento correspondiente e introducir en el mismo el código para enviar el dato. Por ejemplo, echando un vistazo rápido a google, en java sería algo así como:

// this goes wherever you setup your button listener:
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
// enviar por bluetooth el código de botón pulsado
} else if (event.getAction() == MotionEvent.ACTION_UP) {
// enviar por bluetooth el código de botón liberado
}
}
};

Espero ponerte sobre la pista correcta.

Gracias noter, he preguntado en algún foro y con appinventor, que es lo que estoy utilizando para construir aplicaciones no se puede..

Hola de nuevo. Echando un vistazo rápido por google he llegado aquí:
http://code.google.com/p/app-inventor-for-android/issues/detail?id=2078

En uno de los post dice:

We have already developed functions called touchUp and touchDown for Canvases and Sprites. If you want a button with the touchUp and touchDown functions, you can just make an image sprite and upload a button image. The touchUp and touchDown functions will be released soon.

Logan Mercer
MIT App Inventor Developer

Es decir, que podrías utilizar por ejemplo una imagen (un sprite, concretamente) de un botón para lograr tu propósito (supongo :roll_eyes:)