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.
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
è stato macchinoso debuggare a distanza, ma almeno hai visto un pò "la tecnica"
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
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 e tengo la tua
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.
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
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.
Se deve fare solo questo potresti pensare ad un Atmega standalone.
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.