Go Down

Topic: Ayuda con Serial (Read 263 times) previous topic - next topic

eloiquintana

Hola a todos, necesto ayuda:
Necesito leer ESRAcadena de datos caracterr por caracter:

f0,0,0,0,0,0,0,0,0,0,0,0,0514,0525,0496,0514,0495,0493,0507,0508,0515,0503,0506,0497,0498,0505,0,0,0,0,0,0,0

El problema esta alhora de leerlos una a uno con una cadena de int:

Code: [Select]


int a[1];
int state = 0;
int contador = 0;
int contador_errors = 0;
int buffer[108];

void setup()
{
  Serial.begin(19200);
  Serial3.begin(19200);
}

void loop()
{
  while (state == 0)
  {
    if(contador_errors > 5)
    {
      Serial.print("No hay señal!");
      Serial.print("State = 1");
      state = 1;
      contador = 0;
      delay(1000);
    }
    if((Serial3.available() > 0))
    {
      a[0] = Serial3.read();
      buffer[contador] = a[0];
       Serial.print(buffer[contador]);
      contador++;
      contador_errors = 0;

     if(a[0] == 'f')//23 total sense el 0
      {
         c2++;
        contador = 0;
        if(c2 >= 2)state = 1; //leer 2 veces y me voy a mostrar todo el contenido
      }

    }
  }
 
 
  while (state == 1)
  {

    contador = 0;
    while(contador < 108)
    {
      Serial.println(buffer[contador]);
      delay(100);
      contador++;
    }

delay(2000);
state = 0;
  }
}





No se porque no la lee caracter por caracter!!!
AYUDA PLIS!

surbyte

#1
Aug 03, 2014, 09:16 pm Last Edit: Aug 04, 2014, 01:29 am by surbyte Reason: 1
yo haría esto

int function readInt() {
     int tmp;

     //leo un entero
     tmp = Serial.read();
     tmp = tmp << 8;
     tmp |= Serial.read();
     
     return tmp;
}

en lugar de a[1] que mal definiste como entero uso esta función y cargo los datos en el buffer.

Mas simple todavía es usar Serial.parseint(); usala en lugar de Serial.read() pero la variable que recibe el dato debe ser entera.


int a;
int state = 0;
int contador = 0;
int contador_errors = 0;
int buffer[108];

void setup()
{
  Serial.begin(19200);
  Serial3.begin(19200);
}

void loop()
{
  while (state == 0)
  {
    if(contador_errors > 5)
    {
      Serial.print("No hay señal!");
      Serial.print("State = 1");
      state = 1;
      contador = 0;
      delay(1000);
    }
    if((Serial3.available() > 0))
    {
      a = buffer[contador] = Serial3.parseInt();
       Serial.print(buffer[contador]);
       contador++;
       contador_errors = 0;

       if( a == 'f0')//23 total sense el 0
      {
         c2++;
        contador = 0;
        if(c2 >= 2)state = 1; //leer 2 veces y me voy a mostrar todo el contenido
      }

    }
  }
 
 
  while (state == 1)
  {

    contador = 0;
    while(contador < 108)
    {
      Serial.println(buffer[contador]);
      delay(100);
      contador++;
    }

delay(2000);
state = 0;
  }
}

max_saeta

#2
Aug 09, 2014, 01:05 am Last Edit: Aug 09, 2014, 04:33 am by max_saeta Reason: 1
Saludos
Soy nuevo por aquí y también soy un poco curioso, la cadena de caracteres son datos enteros separados por comas? Es decir no seria mas fácil en vez de tomar carácter por carácter luego de f, tomar los datos separados por las comas?  Como usaras los datos obtenidos?

Este primer codigo hace lo que pides
Code: [Select]

/*Convierte cadena String en caracteres CHAR
Por Newlin Max Saeta. 08/08/2014
Este Sketch es ejemplo de como recibir una cadena de
caracteres y convertirla en una arreglo char.
Todas las comas se ignoran y se toman cualquier valor distinto
hasta recibir el un 13 (0x0d) y luego lo imprime para reiniciar la
recepcion
*/
#define VERSION "RECIBIR"

String variable= "";
char caracter[200]; //Cambiar este valor para aumentar o disminuir los caracteres a convertir
int contador;


void setup(){
 Serial.begin(115200);
 Serial.println(VERSION);
}
void loop(){
 if(Serial.available()){
   char lectura = Serial.read();
   if (lectura == 13){
     //Serial.println(variable);
     convierte();
   }
   else {
     if(lectura!= ','){variable+=lectura;} // Ignora las comas recibidas
    //variable+=lectura; // Si desea guardar también las comas
   }
 }
}

void convierte(){
 for(int i= 0; i < variable.length(); i++){
   caracter[i]= variable.charAt(i);
     Serial.print(caracter[i]);
   Serial.print(",");
 }
 variable = "";
 Serial.println();
}


Este código recibe la cadena y convierte cada valor numérico separado por comas en un LONG.

Code: [Select]

/*Convierte cadena de caracteres en variables LONG.
Por Newlin Max Saeta. 08/08/2014
Este Sketch es ejemplo de como recibir una cadena de
caracteres iniciando con el comando "f" y terminando
con un retorno de carro (0x0d).
Ejemplo:
f0,0,0,0,0,0,0,0,0,0,0,0,0514,0525,0496,0514,0495,0493,0507,0508,0515,0503,0506,0497,0498,0505,0,0,0,0,0,0,0
Cada valor a convertir debe finalizar con una coma ','
lo que indicara el inicio de la otra variable
Al final imprime los valores recibidos en la cadena y su valor en LONG
*/
#define VERSION "Convierte cadena de caracteres en Long V0.1"

String variable= "";
const int cantidad= 40; //Cantidad de variables a recibir
int contador;
String str_valor[cantidad];
long   lng_valor[cantidad];
boolean iniciado= false;
unsigned long tiempo= millis();

void setup(){
  Serial.begin(115200);
  Serial.println(VERSION);
}

void loop(){
  if(Serial.available()>0){
    char lectura = Serial.read();
//    Serial.println(lectura);
    switch (iniciado){
    case false:
      if (lectura == 'f'){
        iniciado = true;
      }
      break;
    case true:
      switch (lectura){
      case 13:
        iniciado = false;
        for(int i = 0 ; i < contador; i++){
        }
        convertir_long();
        contador=0;
        break;
      case ',':
        contador++;
        break;
        default:
        if (lectura >= 0x30 && lectura <= 0x39){
          str_valor[contador]+= lectura;
        }
      }   
      break;
    }
  }
}

void convertir_long(){
  for (int m=0; m<contador; m++){
    if (contador > cantidad){return;}
    Serial.print("Cadena: ");
    int largo = (str_valor[m].length());
    if (largo < 4) {Serial.print(" ");}
    if (largo < 3) {Serial.print(" ");}
    if (largo < 2) {Serial.print(" ");}
    Serial.print(str_valor[m]); //Imprime cada cadena contenida entre comas
    str_valor[m].concat(0);
    char buf[str_valor[m].length()];
    str_valor[m].toCharArray(buf,str_valor[m].length());
    lng_valor[m]=atof(buf);
    Serial.print("\t\tValor numerico Long: ");
    if (lng_valor[m] < 100000) {Serial.print(" ");}
    if (lng_valor[m] < 10000) {Serial.print(" ");}
    if (lng_valor[m] < 1000) {Serial.print(" ");}
    if (lng_valor[m] < 100) {Serial.print(" ");}
    if (lng_valor[m] < 10) {Serial.print(" ");}   
    Serial.println(lng_valor[m]); //Imprime el valor LONG
  }
}



Go Up