Conversione string to byte

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.

Controlla anche getBytes() - Arduino Reference

ma così ogni char è un byte, mentre per trasformare da HEX a byte devi unire due char, poichè F = 1111

con 0xB0 mi esce:
0:0
1:x
2:B
3:
4:U accentato
11001111
207
CF

Con 0x02
0:0
1:x
2:0
3:
4:U accentato
10111111
191
BF

Con 0x7F
0:0
1:x
2:7
3:
4:U accentato
101111
47
2F

Nella stdlib.h c'è la funzione strtol

/**
    The strtol() function converts the string in nptr to a long value.
    The conversion is done according to the given base, which must be between 2 and 36 inclusive, or be the special value 0.

    The string may begin with an arbitrary amount of white space (as determined by isspace()) followed by a single optional '+' or '-' sign.
    If base is zero or 16, the string may then include a "0x" prefix, and the number will be read in base 16; otherwise,
    a zero base is taken as 10 (decimal) unless the next character is
    '0', in which case it is taken as 8 (octal).

    The remainder of the string is converted to a long value in the
    obvious manner, stopping at the first character which is not a
    valid digit in the given base.  (In bases above 10, the letter 'A'
    in either upper or lower case represents 10, 'B' represents 11,
    and so forth, with 'Z' representing 35.)

    If endptr is not NULL, strtol() stores the address of the first
    invalid character in *endptr.  If there were no digits at all,
    however, strtol() stores the original value of nptr in *endptr.
  (Thus, if *nptr is not '\\0' but **endptr is '\\0' on return, the entire string was valid.)

    The strtol() function returns the result of the conversion, unless
    the value would underflow or overflow.  If no conversion could be
    performed, 0 is returned.  If an overflow or underflow occurs, 
    errno is set to avr_errno "ERANGE" and the function return value
    is clamped to LONG_MIN or LONG_MAX, respectively.
*/
extern long strtol(const char *__nptr, char **__endptr, int __base);

Minchia Paolo mi hai aperto un mondo ............. che non capisco per niente XD

l'errore è nella trasformazione della String in array di char:

0:0
1:x
2:B
3:
4:U accentato

che versione di IDE usi?
per risolvere puoi provare ad eliminare

char stringa[4];
str.toCharArray(stringa,4);

e invece che usare stringa[numero]
usare str.charAt(numero);

poi, io ho fatto stampare a video 3 volte a in formato binario, dal tuo ouput invece vedo:

10111111
191
BF

il primo valore sarà pure in binario, ma gli altri 2 no... che codice stai usando?

Usavo ide 0023 ...... ora uso 1.0

Niente da fare :*
Ora uso ide 1.0
Se entro con 0xB0
ottengo:
CHAR 2: B
CHAR 3: 0
16 Questo è il Serial.print
10000 Questo è il Serial.print BIN
16 Questo è il Serial.print DEC
10 Questo è il Serial.print HEX

#include <stdlib.h>

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);
    Serial.println(b1,BIN);
    Serial.println(b1,DEC);    
    Serial.println(b1,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)
{
byte a =0;

Serial.print("CHAR 2: ");
Serial.println(str.charAt(2));
Serial.print("CHAR 3: ");
Serial.println(str.charAt(3));

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

ok ci siamo quasi, mi sono dimenticato di aggiungere il 10:

nel primo if (ramo else)
a = str.charAt(2) - 'A';
diventa
a = str.charAt(2) - 'A' + 10;

e nel seocndo if
a += str.charAt(2) - 'A';
diventa
a += str.charAt(2) - 'A' + 10;

FATTO!

lesto

MI TTI COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO !!!!!!!!

Non sai quanto sono felice cazzo
E' da domenica che rompo le palle a destra e a sinistra e tu mi hai risolto un grandissimo problema.
Per molti non sarà niente ma per me è tantissimo.

Non sai da quanto tempo volevo mettere quel [RISOLTO]

grazie per il tuo tempo prezioso speso per me

Alberto

grande :slight_smile:

è stato macchinoso debuggare a distanza, ma almeno hai visto un pò "la tecnica" :grin:
se non hai capito il motivo per cui faccio - 'A' e - '0' dai un'occhiata alla tabella ascii, e in caso chiedi pure

Grazie lesto.
Ora mi metto un poco in pausa :grin:

Comunque la tua soluzione è arrivata mentre stavo approcciando alla funzione che aveva suggerito Paolop
la strtol della quale avevo trovato un codicino che funzionava e stavo cominciando ad capirla per poi
adattarla alle mie esigenza. Sembra semplice !!
Appena arrivata la tua soluzione ho smesso di studiare :blush: e tengo la tua :grin:
La metto comunque in questo thread in caso servisse:

/* strtol example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
  char * pEnd;
  long int li1, li2, li3, li4;
  li1 = strtol (szNumbers,&pEnd,10);
  li2 = strtol (pEnd,&pEnd,16);
  li3 = strtol (pEnd,&pEnd,2);
  li4 = strtol (pEnd,NULL,0);
  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
  return 0;
}

Per completezza metto anche la tua funzione finita che ......... in futuro non si sa mai 8)

void Midi_Send(byte cmd, byte data1, byte data2) {

  Serial.write(cmd);
  Serial.write(data1);
  Serial.write(data2);
}

  byte strConv(String str)
  {
  byte a =0;
/*  
  Serial.print("CHAR 2: ");
  Serial.println(str.charAt(2));
  Serial.print("CHAR 3: ");
  Serial.println(str.charAt(3));
*/  
  if (str.charAt(2) >= '0' && str.charAt(2) <= '9'){ //estraggo 'B'
     a = str.charAt(2) - '0';
  }else{
     a = str.charAt(2) - 'A'+10;
  }
  a = a << 4; //muovo il valore di 4 bit a sinistra
  if (str.charAt(3) >= '0' && str.charAt(3) <= '9'){ //estraggo '1'
     a += str.charAt(3) - '0';
  }else{
     a += str.charAt(3) - 'A'+10;
  }
  return a;
  }

Grazie ancora.

Alla prossima, Alberto

Complimenti.
Adesso l'ultima cosa da vedere è lo spazio utilizzato dalle due soluzioni e privilegiare quella più piccola.
Chissà perché ma lo spazio non basta mai. Uscisse anche un Arduino con 1024k riuscirei a riempirlo. :cold_sweat:

Beh per questo progetto, Paolo è tutto qui.
Praticamente fa solo questo ........ è una specie di rs232 to midi tutto qui.

Si tutto qui perchè adesso funziona :fearful:

Cioa Alberto

PaoloP:
Complimenti.
Adesso l'ultima cosa da vedere è lo spazio utilizzato dalle due soluzioni e privilegiare quella più piccola.
Chissà perché ma lo spazio non basta mai. Uscisse anche un Arduino con 1024k riuscirei a riempirlo. :cold_sweat:

Se deve fare solo questo potresti pensare ad un Atmega standalone. :wink:

E' che ho bisogno di due porte seriali
Una riceve rs232 e l'altra spara su midi

m.alverman:
E' che ho bisogno di due porte seriali
Una riceve rs232 e l'altra spara su midi

Potresti implementarle via software e lasciare quella hardware per il debug.