Ecco, ora la cosa mi può anche tornare. Fino ad ora infatti era una conversione senza senso
Ha qualche suggerimento? Grazie
Ecco, ora la cosa mi può anche tornare. Fino ad ora infatti era una conversione senza senso
Ha qualche suggerimento? Grazie
Hai 1 byte, mi pare di capire.
si ho 1 byte la maschera è 1 byte
scusa se volessi convertire da binario a decimale
int maskA1;
byte maskA[] = {
0, 0, 0, 0, 0, 1, 0, 0 }; // MASK A DEFAULT
for(int i = 0; i < 8 ; i++){
if ( maskA[i] == 1 )
maskA1 += pow( 2, i );
}
// Se tipo qui faccio
if (client.connect(serverA, 23)){
client.write(maskA1);
}
mi dovrebbe inviare il numero decimale associato alla maskA ? o ho detto una stupidaggine? Grazie
Dovrebbe funzionare.
Sull'altra cosa, se vuoi poter inserire la gestione tramite remoto prosegui con la tua idea. Non mi vengono in mente alternative.
secondo me dovresti solo scrivere
client.write(4); // che corrisponde a 00000100, così si che mandi 1 byte
ciao pablos il fatto è che la maschera nel corso del tempo potrebbe cambiare mentre adesso vale 4 in decimale potrebbe valere dopo qualche giorno da configurazione telnet anche 255 quindi deve essere variabile in funzione della maskA espressa in binario...![]()
volevo chiedere un metodo semplice e veloce x convertire da binario a HEX
io ho trovato questo
sia data byte maskA [8] = { 0,1,1,0,1,1,0,1}
int maskA11;
int maskA12;
char maskA1;
char maskA2;
for (int i = 0; i<4; i++){
if (mask[i]== 1)
maskA11 = pow (2, i);
}
maskA1 = switchCase(maskA11);
for (int i = 4; i<8; i++){
if (mask[i]== 1)
maskA12 = pow (2, (i-4));
}
maskA2 = switchCase(maskA12);
dove switchCase è un metodo che accetta come parametro un intero e restituisce il carattere secondo lo switch case dei 16 casi del codice HEX esempio se l'intero è 10 restituisce 'A'.
solo che quando stampo da Telnet quando sono tutti 0 ok quando c'è l'1 mi stampa una cosa variabile è sbagliata pow della libreria math.h oppure l'1 del byte maskA è un char e non è effettivamente l'intero 1? Grazie a tutti coloro che mi vogliano aiutare
lollo1100:
ciao pablos il fatto è che la maschera nel corso del tempo potrebbe cambiare mentre adesso vale 4 in decimale potrebbe valere dopo qualche giorno da configurazione telnet anche 255 quindi deve essere variabile in funzione della maskA espressa in binario...volevo chiedere un metodo semplice e veloce x convertire da binario a HEX
io ho trovato questosia data byte maskA [8] = { 0,1,1,0,1,1,0,1}
int maskA11;
int maskA12;
char maskA1;
char maskA2;
for (int i = 0; i<4; i++){
if (mask[i]== 1)
maskA11 = pow (2, i);
}
maskA1 = switchCase(maskA11);
for (int i = 4; i<8; i++){
if (mask[i]== 1)
maskA12 = pow (2, (i-4));
}
maskA2 = switchCase(maskA12);
dove switchCase è un metodo che accetta come parametro un intero e restituisce il carattere secondo lo switch case dei 16 casi del codice HEX esempio se l'intero è 10 restituisce 'A'. solo che quando stampo da Telnet quando sono tutti 0 ok quando c'è l'1 mi stampa una cosa variabile è sbagliata pow della libreria math.h oppure l'1 del byte maskA è un char e non è effettivamente l'intero 1? Grazie a tutti coloro che mi vogliano aiutare
Ho notato che un primo errore può essere qui
if (mask*== 1)*
l'ho sostituito con
if (mask*== '1')*
Un byte è un unsigned char.
Stai attento al confronto che fai perché gli if sono differenti:
if (mask[i]== 1)
Questo controllo dice: se il valore del byte contenuto nella cella "i" dell'array mask è uguale a 1 allora...
Questo controllo invece:
if (mask[i]== '1)
Dice: se il valore del byte contenuto nella cella "i" dell'array mask è uguale al valore del carattere '1' allora...
Sono 2 confronti con 2 valori differenti.
Nel primo caso il test è vero quando il valore è pari a 1, nel secondo quando il valore è pari a 49, che è il codice ASCII di '1'.
PS.
mi son dimenticato una cosa.
La funzione pow() mi pare restituisca un float. Attenzione agli arrotondamenti di questo tipo di dati.
Se vuoi, usa questa funzioncina che mi sono scritto per le potenze con interi:
unsigned long power (unsigned long tempNum, byte tempMul) {
if (tempMul == 0) {
return 1; //N^0=1
}
unsigned long tempRes = 1;
while (tempMul) {
tempRes *= tempNum;
tempMul--;
}
return tempRes;
}
la chiami così:
risultato = power(base, esponente);
scusa se gli passo byte maskA[] = {
0, 0, 0, 0, 0, 1, 0, 0 }; // MASK A DEFAULT
come faresti a farti restituire una volta 0 e una volta 4
io ho fatto così
int maskA1 = 0;
int maskA2 = 0;
for (int i = 0; i < 4; i++){
if ( maskA[i] == '1' )
maskA1 += pow ( 2, i );
}
for (int i = 4; i < 8; i++){
if ( maskA[i] == '1' )
maskA2 += pow ( 2, (i-4) );
}
quindi da quello che mi hai scritto sopra l'if dovrebbe avere 1 senza gli apici x il mio confronto giusto? o ho capito male? il mio è il valore 1 non il 49 corrispondente in codice ASCII
leo72:
PS.
mi son dimenticato una cosa.
La funzione pow() mi pare restituisca un float. Attenzione agli arrotondamenti di questo tipo di dati.Se vuoi, usa questa funzioncina che mi sono scritto per le potenze con interi:
unsigned long power (unsigned long tempNum, byte tempMul) {
if (tempMul == 0) {
return 1; //N^0=1
}
unsigned long tempRes = 1;
while (tempMul) {
tempRes *= tempNum;
tempMul--;
}
return tempRes;
}
la chiami così:risultato = power(base, esponente);
scusa ma perchè la funzione pow della classe math è così stro.nza perdonami la parola ho notato anche io sto fatto ma se io volessi lavorare con interi ...mi devo fare una funzione di potenza come hai fatto tu? fondamentalmente convertire da binario a decimale è una potenza del 2 ma sempre intera è. Perche deve restituire un double e accettare 2 float come parametri (sia x base che esponente) ...capisco la generalizzazione ma quando fanno queste funzioni le potrebbero fare + utili
non trovi ...quando mai userò pow con questi vincoli che impongono loro
Grazie Leo e scusami x lo sfogo ...ma se fanno le cose le potrebbero fare + utili ...non trovi? ![]()
Farne più "versioni" avrebbe comportato un aggravio di codice.
Inoltre i numeri possono crescere di valore con le potenze, anche da sfondare il limite dei 32 bit. Con un float puoi in teoria salire di più, perdendo però precisione.
Questo è ovviamente IMHO.
Tornando al tuo problema, sostituisci pow con power, ed includi la funzione nel tuo codice.
si e il confronto è con 1 non con '1' giusto ?
altrimenti non sarebbe mai vero ...ecco perchè ora mi da 00
come maskA in HEX stampata su telnet ![]()
stavo leggendo la tua funzione power. Nel mio caso potrei passare banalmente 2 interi come parametri e farmi restituire un intero ? giusto cioè i miei casi vanno da 0 a 8 giusto 2 alla 0, 2 alla 1, 2 alla 2, 2 alla 3 quindi posso modificarla con il tipo di dati passati ![]()
Grazie mille Leo fortuna che ci siete voi ![]()
asp ti posto un pò di codice almeno proviamo a capire dove sbaglio ![]()
#include <SPI.h> // IMPORTA LIBRERIA SPI
#include <Ethernet.h> // IMPORTA LIBRERIA ETHERNET
int maskA1 = 0;
int maskA2 = 0;
char maskA11;
char maskA21;
byte maskA[] = {
0, 0, 0, 0, 0, 1, 0, 0 }; // MASK A DEFAULT
void loop(){
for (int i = 0; i < 4; i++){
if ( maskA[i] == 1 )
maskA1 += power( 2, i );
}
maskA11 = switchCase(maskA1);
for (int i = 4; i < 8; i++){
if ( maskA[i] == 1 )
maskA2 += power( 2, (i-4) );
}
maskA21 = switchCase(maskA2);
// questo per stamparlo su Telnet
client.print(" MASK A IN HEX : ");
client.print(maskA11);
client.println(maskA21);
}
char switchCase (int var){
char var2;
switch(var){
case 0:
var2 = '0';
break;
case 1:
var2 = '1';
break;
case 2:
var2 = '2';
break;
case 3:
var2 = '3';
break;
case 4:
var2 = '4';
break;
case 5:
var2 = '5';
break;
case 6:
var2 = '6';
break;
case 7:
var2 = '7';
break;
case 8:
var2 = '8';
break;
case 9:
var2 = '9';
break;
case 10:
var2 = 'A';
break;
case 11:
var2 = 'B';
break;
case 12:
var2 = 'C';
break;
case 13:
var2 = 'D';
break;
case 14:
var2 = 'E';
break;
case 15:
var2 = 'F';
break;
default:
break;
}
return var2;
}
int power (int tempNum, int tempMul) {
if (tempMul == 0) {
return 1; //N^0=1
}
int tempRes = 1;
while (tempMul) {
tempRes *= tempNum;
tempMul--;
}
return tempRes;
}
sul confronto
if ( maskA == 1 ) ci ho messo
_ if ( maskA == byte(1) )_
ma così facendo mi restituisce ogni volta un carattere diverso sulla configurazione del telnet invece io vorrei i due caratteri esadecimali 04H ovvero 04
Perché se converti in char poi fai restituire alla funzione switchCase un int?
PS:
non ti seguo più, mi sto intrecciando... ![]()
Leo e a tutto il forum stavo pensando una scorciatoia...se io convertissi la mia matrice da binario a DEC (ovviamente non mi riesce questa funzione) e poi lo stampassi come client.print(numDec,HEX); però c'è un piccolo problema lui potrebbe inviare un solo carattere ovvero se client.print(0,HEX); invia solo 0 io vorrei però una formattazione sempre a 2 caratteri esadecimali ovvero client.print(0,HEX) deve stampare 00h tipo poi a quel punto il problema rimarrebbe convertire la mia matrice di 8 bit(byte) in un numero decimale ![]()
leo72:
Perché se converti in char poi fai restituire alla funzione switchCase un int?PS:
non ti seguo più, mi sto intrecciando...
no la mia idea era quella di passare un intero alla funzione switchCase in particolare gli passavo la conversione decimale ( che non va bene ) al mio switchCase e questo metodo implementato da me mi restituiva il carattere corrispondente esempio switchCase(10) = 'A'
volevo far questo ma a quanto pare non funziona e a quanto pare il problema sta su quel ciclo for quello in cui converto la mia array di 1/0 nel numero decimale corrispondente a sto punto pensavo che per stampare FF o 00 bastava fare
client.print(numeroDecimale,HEX) ovviamente questo metodo è un pò strano xk c'è rischio che mi tronca un carattere esadecimale il MSB x intendersi giusto ?
Dai retta a me. Raggruppa i vari byte delle tue letture in 2 byte con la funzione bitSet che ti avevo illustrato in precedenza, così eviti le potenze.
Poi non fare lo switch per convertire in esadecimale, ma prova stampando con client.print(mask1, HEX).
scusa tu partendo da qui
byte maskA[] = {
0, 0, 0, 0, 0, 1, 0, 1 }; // MASK A DEFAULT
come procederesti faresti bitSet() su maskA io in pratica dovrei inviare 05 in HEX mo stavo provando a convertire con una botta sola con queste ma faccio un casino clamoroso http://arduino.cc/en/Reference/HomePage di Conversion passando l'intera matrice come parametro provavo a convertire in int o in byte ma probabilmente non fanno la funzione che voglio io ![]()
Io sto ancora nella fase primordiale ovvero ho quella maschera voglio mandare 1 byte due caratteri ad esempio FF tutti i led sono comandati 00 nessun led è stato comandato e i casi intermedi di alcuni led comandati dovrei passare da quella maskA ad inviare 2 caratteri esadecimali che siano coerenti con quanto scritto in binario nella maschera purtroppo la maschera è binaria x modo di dire da quello che ho capito ogni 0 o 1 dentro a maskA è un byte a sua volta composto da 0 bit che formano il numero del codice ascii corrispondente giusto?
Tipo così, riprendendo il tuo codice
for (int i = 0; i < 4; i++) {
if ( maskA[i] == 1 )
bitSet(maskA1, i);
}
leo72:
Tipo così, riprendendo il tuo codicefor (int i = 0; i < 4; i++) {
if ( maskA[i] == 1 )
bitSet(maskA1, i);
}
scusa ma maskA1 così facendo sarebbe di nuovo un byte di caratteri binari? questo vorresti fare? xk almeno dopo si converte al volo? giusto???
scusa ancora l'ignoranza io l'avevo pensata così ma
if ( maskA == 1 )
che farebbe? cioè in teoria x come la vedo io dovrebbe prendere l'iesimo byte di maskA e verificare se sia uguale a 1 giusto? in questo caso se è vera che fa con l'istruzione di sotto ? bitSet ancora non l' ho capita bene nonostante l'ho letta e riletta come funzione. Grazie