Go Down

Topic: [Risolto] Xbee:inviare 2 o più valori contemporaneamente (Read 1 time) previous topic - next topic

GWolf

le y potrebbero rappresentare un disturbo secondo te? li c'è da vedere chi invia i dati...

sciorty


le y potrebbero rappresentare un disturbo secondo te? li c'è da vedere chi invia i dati...


Non un disturbo ma l'equivalente di "niente". Infatti se attendo un tot prima di leggere il char successivo le y diminuiscono. Ma una c'è sempre, anche se il delay lo porto a 100!
La stringa la invio o tramite DOS o tramite XCTU e la storia è sempre la stessa.. non so più cosa fare, sono rimasto fermo!

GWolf

metti un semplice while e se il read ritorna 'y' continua a leggere, del tipo

char c;
while((c = serial.read()) == 'y'){}
//alla fine del while in c avrai il carattere "valido"

sciorty


metti un semplice while e se il read ritorna 'y' continua a leggere, del tipo


L'ho detto, ci ho provato :) solo che non è un carattere normale quindi può essere che sul monitor me lo stampa come y strana mentre invece è qualcos'altro.
Infatti chiedo se qualcuno sa come individuare questo carattere "null", in modo da filtrare come mi hai proposto. Non è un metodo perfettamente pulito ma mi potrebbe bastare perora

GWolf

leggilo come valore esadecimale e vedi cosa esce

sciorty

#20
May 04, 2012, 10:17 pm Last Edit: May 04, 2012, 11:27 pm by sciorty Reason: 1
Hola!
Oggi mi sono messo con calma e con mia grande sorpresa sono riuscito a fare ciò che volevo :)

data una stringa nome1val1nome2val2..nomenvaln; prendere i valori ed assegnarli ad una variabile:

Code: [Select]
#include <NewSoftSerial.h>
NewSoftSerial my(3,2);

char val;
String string="";
String a="";
String b="";
String c="";
int a_int,b_int,c_int;

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

void loop(){
 
 
 
  if(my.available()>0)
  {
    a=b=c=string="";
   
    val=my.read();
   
    while(val!=';'){
     if(my.available()>0)
     {
       string+=val;
       val=my.read();     
     }
    }
   
    Serial.println(string);
     
    for(int i=0;i<string.length();i++){
      if(string.substring(i,i+1).equals("a"))
      {
        i++;
        while(!string.substring(i,i+1).equals("b")){
          a+=string.substring(i,i+1);
          i++;
        }
      }
      if(string.substring(i,i+1).equals("b"))
      {
        i++;
        while(!string.substring(i,i+1).equals("c")){
          b+=string.substring(i,i+1);
          i++;
        }
      }
      if(string.substring(i,i+1).equals("c"))
      {
        i++;
        while(!string.substring(i,i+1).equals("")){
          c+=string.substring(i,i+1);
          i++;
        }
      }
    }
    a_int=stoi(a);
    b_int=stoi(b);
    c_int=stoi(c);
    Serial.print(a_int);
    Serial.print("--");
    Serial.print(b_int);
    Serial.print("--");
    Serial.println(c_int);
   
   
   
  }
 
 

 
}


int stoi(String s){
  byte sLen = s.length();
  int retNum = 0;
  for(byte k=0; k < sLen; k++){
    retNum += ((byte)s.charAt(k)-48) * pow(10, sLen-k-1);
  }
  return retNum;
}


So che magari mi sono complicato un po' la vita ma almeno quello che esce è pulito e non ci sono problemi di tempismo!

L'unico problema è che quella funzione lì che mi trasforma una stringa in un int mi torna dei valori decrementati di 1 ogni tanto.. l'avevo presa sul forum, non ricordo da chi!

A tal proposito vorrei chiedervi una funzione che compie lo stesso lavoro ma magari più immediata :)




EDIT: Niente, apposto. Bastava solo cercare bene  :smiley-sweat:
Code: [Select]

int stoi(String text)
{
  char temp[20];
  text.toCharArray(temp, 19);
  int x = atoi(temp);
  if (x == 0 && text != "0")
  {
    x = -1;
  }
  return x;







Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy