Go Down

Topic: Conversione string to byte (Read 2987 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