Conversione string to byte

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

Grazie, Alberto

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

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

bhe, direi che puoi impararlo da solo :smiley:
p.s. ho corretto un errore nelle if

Semmai era così !!

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

m.alverman:
Semmai era così !!

non vedo alcuna differenza (a parte una parentesi).
Invece sono sbagliati gli indici!

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

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

la funzione è questa

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

yep hai ragione! :cold_sweat:

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

infatti
Serial.write (byte);
avresti dovuto cambiarla in
Serial.write (a);

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;
}

@Lesto

Il codice che mi hai consigliato non funziona.
Prova a testarlo se vuoi

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;
}

per forza, str deve essere un array di char, non una classe String :grin:

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

passa la string e poi usa il metodo getArray() (forse non si chama così ma guarda nel reference)

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

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

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;
}

la Midi_Send non dovrebbe usare write e non println?

non puoi mettere “il char”, poichè sono 2 char che vanno uniti assieme che rappresentano il tuo dato.
il problema potrebbe essere che byte a ha il segno! quindi usa un int a, e poi fai return (byte)a

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

diventa

byte strConv(String str)
{
char stringa[5];
str.toCharArray(stringa,5);

Si Midi_Send usa write ma per le prove uso print per vedere il dato.

Ora provo con la modifica che mi hai consigliato

Grazie

Grazie lesto per la pazienza e l’impegno che stai dimostrando :fearful:

Ho provato ma non funziona.
Qualsiasi valore che entro mi ritorna 10111111 cioè 191 cioè BF che nella tabella esadecimale corrispondono
La conversione sembra funzionare ma risulta indifferente al dato che invio

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(b3,BIN);
    Serial.println(b3,DEC);    
    Serial.println(b3,HEX);

//    Midi_Send(176,01,127);
  }
}
  
void Midi_Send(byte cmd, byte data1, byte data2) 
{
  Serial.write(cmd);
  Serial.write(data1);
  Serial.write(data2);
}


byte strConv(String str)
{
char stringa[5];
str.toCharArray(stringa,5);

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

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

B0 dovrebbe convertirlo in 176 cioè 10110000

ci sono vari errori

byte strConv(String str)
{
char stringa[4];
str.toCharArray(stringa,4);

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

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

correzioni:
indici di array
manca il += nella seconda if
output migliorato

allega l’output di una o più conversioni, grazie.