Go Down

Topic: Programar contraseña (Read 2456 times) previous topic - next topic

Diegoo

Buenas, después de buscar en el foro no he encontrado exactamente lo que quiero programar.

Os expongo mi problema:

Estoy intentando poder escribir una contraseña por puerto serie y meter cada caracter en una variable para poderla luego comparar con la contraseña guardada en el microprocesador. Mi problema es que el programa se ejecuta sin esperar a que reciba nada por el puerto serie por lo que las variables se quedan vacias, mi intención es poder poner el programa en espera a que reciba datos por el puerto serie para grabarlo en una variable detras de otra o enviar un string y que se grabe en una array de variables en el micro.

He probado con el Serial.available() pero no me funciona y los arrays me da error. Os copio el codigo que tengo pendiente de modificar para que haga lo que necesito, es solo parte del código ya que el resto del programa funciona correctamente.
Gracias de antemano.

Quote

      Serial.print("Introduce password");
      pass[0] = Serial.read(); // Leer puerto serie y grabaro en la memoria EEPROM para cambiar la contraseña del dispositivo.
      EEPROM.write(mem0,serie);
      pass[1] = Serial.read(); // Leer puerto serie y grabaro en la memoria EEPROM para cambiar la contraseña del dispositivo.
      EEPROM.write(mem1,serie);
      pass[2] = Serial.read(); // Leer puerto serie y grabaro en la memoria EEPROM para cambiar la contraseña del dispositivo.
      EEPROM.write(mem2,serie);
      pass[3] = Serial.read(); // Leer puerto serie y grabaro en la memoria EEPROM para cambiar la contraseña del dispositivo.
      EEPROM.write(mem3,serie);
      Serial.print("Password introducida correctamente");






xload

Buenas Diegoo, creo que tiene algo que ver con que no compruebas si el serial tiene algo disponible, y lo lees directamente, te pego un codigo que he encontrado por ahi:

Code: [Select]
char inData[20]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character

void setup() {
    Serial.begin(9600);
    Serial.write("Power On");
}

char Comp(char* This) {
    while (Serial.available() > 0) // Don't read unless
                                   // there you know there is data
    {
        if(index < 19) // One less than the size of the array
        {
            inChar = Serial.read(); // Read a character
            inData[index] = inChar; // Store it
            index++; // Increment where to write next
            inData[index] = '\0'; // Null terminate the string
        }
    }

    if (strcmp(inData,This)  == 0) {
        for (int i=0;i<19;i++) {
            inData[i]=0;
        }
        index=0;
        return(0);
    }
    else {
        return(1);
    }
}

void loop()
{
    if (Comp("m1 on")==0) {
        Serial.write("Motor 1 -> Online\n");
    }
    if (Comp("m1 off")==0) {
        Serial.write("Motor 1 -> Offline\n");
    }
}

Diegoo

He probado con Serial.available() pero no se queda a la espera de recibir datos por puerto serie, quiza lo utilize mal. copio el codigo

  case 'c':
    {
       Serial.print(Serial.available());
      Serial.print("Introduce password");
      while(Serial.available()==0)   {};     
      pass[0] = Serial.read(); // Leer puerto serie y grabaro en la memoria EEPROM para cambiar la contraseña del dispositivo.
       EEPROM.write(mem0,serie);
        Serial.print(Serial.available());

Alguna sugerencia?

AntonioM

Tal vez si pones el código completo sea más fácil ver donde está el problema, al menos a mi no me queda claro con lo que pusiste.

curro92

#4
Jul 26, 2012, 06:29 am Last Edit: Jul 26, 2012, 06:31 am by curro92 Reason: 1
Hola,
yo rellenaría primero una cadena acabada en '\0', y luego copiaría dicha cadena a la eeprom
Para rellenar la cadena supongo que el carácter  fin de cadena es el retorno de carro (que puede ser el 10, el 13 o los dos juntos).
A mí me funciona este código

Code: [Select]

#define MAXCADENA 20
char cadena[MAXCADENA];

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

int leerCadena(char *cadena)
{
  int i;
  char c;
  i = 0;
  while (Serial.available())
  {
      c = Serial.read();
      if(c == 10 || c == 13) // fin de línea
         break;
      if(i < MAXCADENA - 1)
         cadena[i++] = c;
      delay(5);  
  }
  cadena[i] = '\0';
  return i;
}



void loop()
{  
   if(Serial.available())
   {
      leerCadena(cadena);

      // ahora se puede utilizar la cadena para lo que se quiera
      Serial.println(cadena);
   }
   delay(5);
}


Es importante poner los delay() , aunque los tiempos supongo que puedan variar.




Go Up