Pages: [1]   Go Down
Author Topic: Programar contraseña  (Read 2019 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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");




Logged

Zaragoza
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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");
    }
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Ensenada, Mexico
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 721
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.



« Last Edit: July 25, 2012, 11:31:36 pm by curro92 » Logged

Pages: [1]   Go Up
Jump to: