Pages: [1]   Go Down
Author Topic: Ya no se que hacer con el serial  (Read 1082 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
Arduino rocks | PandoraBox rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

tengo un proyecto de domotica que usa módulos rf para comunicarse. desde la pc envió parámetros que los arduinos leen y luego actúan sobre esos datos. esa parte funciona perfecto, el problema es cuando los arduinos envían datos a la pc.

al enviar datos de la pc al arduino lo envio de esta forma:

nombre-accion-encender-nombredelpin
ej
cocina-acc-onn-id13

el arduino lee y si ese arduino se llama cocina actúa encendiendo el pin 13

otro parámetro es:

cocina-inf-pin-temp

y es aquí donde esta el problema, ya que el arduino lee y si es cocina actúa devolviendo la temperatura
28.7-T

pero los demás arduinos también leen estos datos y se quedan esperando para llenar la variable parámetro (longitud de 20 caracteres)
entonces nunca actúa bien, alguna duda como solucionarlo?
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Creo que deberías refinar un poco tu protocolo de comunicación. Por ejemplo; si cuando el pc manda algo al arduino lo "nombra" en primer lugar, ¿por qué cuando un arduino responde al pc no comienzas nombrándolo y así los demás descartan el mensaje?
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
Arduino rocks | PandoraBox rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

esta bien es un buen punto, pero el problema radica en llenar el espacio que dejan las variables, ya q si no hay 20 caracteres en el buffer no se llena la variable y no hace nada
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cuando el arduino contesta, puede devolver la temperatura incluyendo antes un destinatario, como por ejemplo "PC".

De igual manera que los arduinos saben si la pregunta iba para ellos y solo contesta "cocina", de esta manera deben de discriminar y no hacer nada pues el mensaje no es para ellos.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
Arduino rocks | PandoraBox rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ahora no estoy en mi casa sino te enviava el codigo para que lo vieras.

lo que hace el codigo es:

hay coneccion en serial - entonces leo los datos y los cargo en un string[]

pero espera a llenar el string con un largo de 20 caracteres

si yo envio

25.6-t (esta es una respuesta que da un arduino) no llena la variable y simplemente se queda esperando por los demas caracteres.

algunas de las formas que se me ocurrio para solucionarlo son:

leer el tamaño de datos recivido por el serial y si es menor a los 20 caracteres borrarlo y no hacer nada.
(ni idea de como hacer esto)

verificar q los primeros 6 caracteres definan el nombre de la placa y sino descartar todo y borrar variables
(por algun motivo no funciona)
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
Arduino rocks | PandoraBox rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if (Serial.available() > 0) //si hay coneccion
  {
    // lee el byte entrante:
    leo = ((char)Serial.read());

    //limpio las variables
    vpar[0]="";
    vpar[1]="";
    vpar[2]="";
    vpar[3]="";

    for(int k=0;k==20;k++)
    {
      Parametro[k]="";
    }


    if(p<19)
    {
      if(leo==46)
      {
        Parametro[p] = ".";
        p++;
      }
      if(leo==45)
      {
        Parametro[p] = "-";
        p++;
      }
      if(leo==48)
      {
        Parametro[p] = "0";
        p++;
      }
      if(leo==49)
      {
        Parametro[p] = "1";
        p++;
      }
      if(leo==50)
      {
        Parametro[p] = "2";
        p++;
      }
      if(leo==51)
      {
        Parametro[p] = "3";
        p++;
      }
      if(leo==52)
      {
        Parametro[p] = "4";
        p++;
      }
      if(leo==53)
      {
        Parametro[p] = "5";
        p++;
      }
      if(leo==54)
      {
        Parametro[p] = "6";
        p++;
      }
      if(leo==55)
      {
        Parametro[p] = "7";
        p++;
      }
      if(leo==56)
      {
        Parametro[p] = "8";
        p++;
      }
      if(leo==57)
      {
        Parametro[p] = "9";
        p++;
      }
      if(leo==97)
      {
        Parametro[p] = "A";
        p++;
      }
      if(leo==98)
      {
        Parametro[p] = "B";
        p++;
      }
      if(leo==99)
      {
        Parametro[p] = "C";
        p++;
      }
      if(leo==100)
      {
        Parametro[p] = "D";
        p++;
      }
      if(leo==101)
      {
        Parametro[p] = "E";
        p++;
      }
      if(leo==102)
      {
        Parametro[p] = "F";
        p++;
      }
      if(leo==103)
      {
        Parametro[p] = "G";
        p++;
      }
      if(leo==104)
      {
        Parametro[p] = "H";
        p++;
      }
      if(leo==105)
      {
        Parametro[p] = "I";
        p++;
      }
      if(leo==106)
      {
        Parametro[p] = "J";
        p++;
      }
      if(leo==107)
      {
        Parametro[p] = "K";
        p++;
      }
      if(leo==108)
      {
        Parametro[p] = "L";
        p++;
      }
      if(leo==109)
      {
        Parametro[p] = "M";
        p++;
      }
      if(leo==110)
      {
        Parametro[p] = "N";
        p++;
      }
      if(leo==111)
      {
        Parametro[p] = "O";
        p++;
      }
      if(leo==112)
      {
        Parametro[p] = "P";
        p++;
      }
      if(leo==113)
      {
        Parametro[p] = "Q";
        p++;
      }
      if(leo==114)
      {
        Parametro[p] = "R";
        p++;
      }
      if(leo==115)
      {
        Parametro[p] = "S";
        p++;
      }
      if(leo==116)
      {
        Parametro[p] = "T";
        p++;
      }
      if(leo==117)
      {
        Parametro[p] = "U";
        p++;
      }
      if(leo==118)
      {
        Parametro[p] = "V";
        p++;
      }
      if(leo==119)
      {
        Parametro[p] = "W";
        p++;
      }
      if(leo==120)
      {
        Parametro[p] = "X";
        p++;
      }
      if(leo==121)
      {
        Parametro[p] = "Y";
        p++;
      }
      if(leo==122)
      {
        Parametro[p] = "Z";
        p++;
      }     
    }

    if(p==19)
    {
      for(int i=0;i<19;i++)
      {
        if(Parametro[i]=="-")
        {
          if(h==3)
          {
            i++;
          }
          if(h==2)
          {
            h=3;
            i++;
          }
          if(h==1)
          {
            h=2;
            i++;
          }
          if(h==0)
          {
            h=1;
            i++;
          }
        }
        vpar[h] = vpar[h] + Parametro[i];
      }
      p=0;
      h=0;
    }
  }
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si no vas a enviar datos de un tamaño igual siempre, ¿Por qué usas la longitud como separador de comandos?
Yo lo que haría sería definir un caracter de inicio de comando y uno de separador de parámetros, y:

  • Desechar lo recibido, hasta recibir el caracter de inicio de comando (p. ej. \n).
  • Leer secuencialmente hasta encontrar el caracter separador (por tus comandos podría ser el guión).
  • Comparo lo recibido, desechando el guión, con mi id de dispositivo.
  • Si es mi id de dispositivo, leo hasta el siguiente guión y tendré el primer parámetro, leo hasta el segundo, y tendré el siguiente parámetro, y así sucesivamente.
  • Si no era para mí, vuelvo al punto 1. El caracter de inicio de comando, deberá hacer saltar el código en cualquer momento al punto 2 (así, si por ejemplo no se recibio bien algo, al menos saldrá del bucle cuando comience un nuevo comando

« Last Edit: March 09, 2013, 10:05:33 am by noter » Logged

Pages: [1]   Go Up
Jump to: