Go Down

Topic: Conversione string to byte (Read 3589 times) previous topic - next topic

m.alverman

Buongiorno,
Se ho una stringa che contiene 0xB0 come posso convertirla in byte per poterla spedire con serial.write ?

Grazie, Alberto

lesto

#1
Apr 26, 2012, 01:12 pm Last Edit: Apr 26, 2012, 02:41 pm by lesto Reason: 1
salti i primi 2 caratteri che non ti servono.
poi fai

//attenzione usare solo lettere masiuscole, non c'è controllo dell'input
byte a =0;
stringa [4] = "0xB1";
if (stringa[2] >= '0' && stringa[2] <= '9'){ //estraggo 'B'
  byte = stringa[0] - '0';
}else{
  byte = stringa[0] - 'A';
}
byte = byte << 4; //muovo il valore di 4 bit a sinistra
if (stringa[3] >= '0' && stringa[3] <= '9'){  //estraggo '1'
  byte += stringa[0] - '0';
}else{
  byte += stringa[0] - 'A';
}
Serial.write (byte);


EDIT: corretti i segni delle if
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

m.alverman

Grazie lesto.

Come si fa a creare una funzione che entrando una stringa mi ritorni il byte.

Funzioni con ritorno valori non ne ho mai fatte :)

Grazie, Alberto

lesto

bhe, direi che puoi impararlo da solo  :D
p.s. ho corretto un errore nelle if
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

m.alverman

Semmai era così !!

Code: [Select]

//attenzione usare solo lettere masiuscole, non c'è controllo dell'input
byte a =0;
stringa [4] = '0xB0';
if (stringa[2] >= '0' && stringa[2] <= '9'){ //estraggo 'B'
   a = (stringa[0] - '0');
}else{
   a = stringa[0] - 'A';
}
a = a << 4; //muovo il valore di 4 bit a sinistra
if (stringa[3] >= '0' && stringa[3] <= '9'){  //estraggo '1'
   a += stringa[0] - '0';
}else{
   a += stringa[0] - 'A';
}
Serial.write (byte);

lesto


Semmai era così !!


non vedo alcuna differenza (a parte una parentesi).
Invece sono sbagliati gli indici!
Code: [Select]

//attenzione usare solo lettere masiuscole, non c'è controllo dell'input
byte a =0;
stringa [4] = '0xB0';
if (stringa[2] >= '0' && stringa[2] <= '9'){ //estraggo 'B'
   a = stringa[2] - '0';
}else{
   a = stringa[2] - 'A';
}
a = a << 4; //muovo il valore di 4 bit a sinistra
if (stringa[3] >= '0' && stringa[3] <= '9'){  //estraggo '1'
   a += stringa[3] - '0';
}else{
   a += stringa[3] - 'A';
}
Serial.write (byte);
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

m.alverman

Hai ragione per gli indici ma avevi messo
al posto di a hai messo byte

la funzione è questa

Code: [Select]

byte strConv(String str)
{
//attenzione usare solo lettere masiuscole, non c'è controllo dell'input
byte a =0;
stringa [4] = str;
if (stringa[2] >= '0' && stringa[2] <= '9'){ //estraggo 'B'
   a = stringa[2] - '0';
}else{
   a = stringa[2] - 'A';
}
a = a << 4; //muovo il valore di 4 bit a sinistra
if (stringa[3] >= '0' && stringa[3] <= '9'){  //estraggo '1'
   a += stringa[3] - '0';
}else{
   a += stringa[3] - 'A';
}
return str;
}


sto provando ad usarla

lesto

yep hai ragione!  :smiley-roll-sweat:

non ritorni str (cioè la stringa), ma a (cioè il byte)

infatti
Serial.write (byte);
avresti dovuto cambiarla in
Serial.write (a);
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

m.alverman

Come si fa a far andare questo sputo di codice
Ero riuscito ma con tutte le prove che ho fatto mi sono incasinato tra i vari ide e non riesco più a farlo andare ....... (bestemmione)

char inByte;
char data;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available()>0)
  {
    inByte = Serial.read();
    data = inByte;
    Serial.print (strConv(data));   
  }
}

byte strConv(String str)
{
byte a =0;
String stringa[4] = str;
if (stringa[2] >= '0' && stringa[2] <= '9'){ //estraggo 'B'
   a = stringa[2] - '0';
}else{
   a = stringa[2] - 'A';
}
a = a << 4; //muovo il valore di 4 bit a sinistra
if (stringa[3] >= '0' && stringa[3] <= '9'){  //estraggo '1'
   a += stringa[3] - '0';
}else{
   a += stringa[3] - 'A';
}
return a;
}

m.alverman

@Lesto

Il codice che mi hai consigliato non funziona.
Prova a testarlo se vuoi
Code: [Select]

char inByte;
char data;

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

void loop()
{
  if (Serial.available()>0)
  {
    Serial.print (strConv('0x00'),DEC);
  }
}

byte strConv(String str)
{
byte a =0;
if (str[2] >= '0' && str[2] <= '9'){ //estraggo 'B'
   a = str[2] - '0';
}else{
   a = str[2] - 'A';
}
a = a << 4; //muovo il valore di 4 bit a sinistra
if (str[3] >= '0' && str[3] <= '9'){  //estraggo '1'
   a += str[3] - '0';
}else{
   a += str[3] - 'A';
}
return a;
}

lesto

per forza, str deve essere un array di char, non una classe String  :smiley-mr-green:
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

m.alverman

E come faccio a passare una'array di char ad una funzione ?

lesto

passa la string e poi usa il metodo getArray() (forse non si chama così ma guarda nel reference)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

m.alverman

Ascolta lesto, non ce la faccio proprio.
I tuoi consigli sono stati utili ma ci ho perso un'altra giornata e non ho risolto.

Ora non vorrei perdere un'altra giornata con getarray, se è quello.

Non è possibile entrati nella funzione, ciclare la stringa e mettere il relativo char del carattere nell'array ?
Anche qui a parole lo so dire ma a codice mi servirebbe una mano.

Grazie, Alberto

m.alverman

Così gli passo la stringa e la converto in array di char ma non funziona !!

Code: [Select]

byte b1;
byte b2;
byte b3;

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

void loop()
{

  String b = "0xB0";
  String c = "0x02";
  String d = "0x7F";
 
  while (Serial.available()>0)
  { 
   
    Serial.read();
   
    b1=(strConv(b));
    b2=(strConv(c));   
    b3=(strConv(d));

//    Serial.println(b1,BYTE);
//    Serial.println(b2,BYTE);
//    Serial.println(b3,BYTE);   

    Midi_Send(b1,b2,b3);
  }
}

void Midi_Send(byte cmd, byte data1, byte data2) {
  Serial.println(cmd,DEC);
  Serial.println(data1,DEC);
  Serial.println(data2,DEC);
}


byte strConv(String str)
{
//Serial.println(str);
String cmd=str;
char stringa[5];
String mystr=cmd.substring(0,5);
mystr.toCharArray(stringa,5);

Serial.println(stringa[0]);
Serial.println(stringa[1]);
Serial.println(stringa[2]);
Serial.println(stringa[3]);

byte a =0;
if (stringa[2] >= '0' && stringa[2] <= '9'){ //estraggo 'B'
   a = stringa[2] - '0';
}else{
   a = stringa[2] - 'A';
}
a = a << 4; //muovo il valore di 4 bit a sinistra
if (stringa[3] >= '0' && stringa[3] <= '9'){  //estraggo '1'
   a += stringa[3] - '0';
}else{
   a += stringa[3] - 'A';
}
return a;
}

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