Pages: [1] 2 3   Go Down
Author Topic: Conversione string to byte  (Read 2395 times)
0 Members and 1 Guest are viewing this topic.
Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Grazie, Alberto
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: April 26, 2012, 07:41:12 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

Grazie, Alberto
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Semmai era così !!

Code:
//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);
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Semmai era così !!

non vedo alcuna differenza (a parte una parentesi).
Invece sono sbagliati gli indici!
Code:
//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);
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

la funzione è questa

Code:
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
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Lesto

Il codice che mi hai consigliato non funziona.
Prova a testarlo se vuoi
Code:
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;
}
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per forza, str deve essere un array di char, non una classe String  smiley-mr-green
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cremona
Offline Offline
Full Member
***
Karma: 2
Posts: 148
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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;
}
Logged

Pages: [1] 2 3   Go Up
Jump to: