Go Down

Topic: Invio Byte per configurare OUTPUT sul server (Read 10112 times) previous topic - next topic

lollo1100

pablos questa differenza tra client.print e client.write...l'ho colta il mio problema è il seguente ho un maschera 8 byte ...quindi sono 8 0/1...questi dovrebbero essere convertiti in esadecimale quindi da 0 ad F e inviati al server. Quest'ultimo deve leggere o 0 o F e riconvertirlo in binario x capire quali di 8 led come dice Leo i pin da 2 a 9 sono effettivamente output il byte corrispondete è 1, se è 0 il corrispondente pin non è attivo. a quel punto dovrei contemporaneamente a quanto detto inviare ulteriori 2 byte da 00 a FF x determinare il comportamento del LED in questione se è attivo (in base alla maschera precedente). Per la convezione da binario a HEX mi sono avvalso di una conversione binario - decimale a quel punto se il valore è 10 con un case switch attribuivo il carattere A ... se era 11 il B ecct in ricezione (lato server) dovrò fare la cosa opposta ovvero da 0 o F (Ah ovviamente) x fare la conversione ho spedito due mini array da 4 byte l'una quindi un singolo carattere esadecimale alla volta...tornando al discorso server dovrei a partire dal carattere esadecimale ricevuto riempire due mini array da 4 x impostare lo stato dei pin da 2 a 9 ...e poi leggere ulteriori 2 byte x il comportamento dei pin. Grazie a tutti coloro che mi vogliano aiutare

leo72

Scusa ma non riesco a capire. Aiutami per favore...


pablos questa differenza tra client.print e client.write...l'ho colta il mio problema è il seguente ho un maschera 8 byte ...quindi sono 8 0/1...

Hai 1 byte, mi pare di capire.

Quote

questi dovrebbero essere convertiti in esadecimale quindi da 0 ad F e inviati al server.

Perché devi convertirli in esadecimale?

Quote

Quest'ultimo deve leggere o 0 o F e riconvertirlo in binario x capire quali di 8 led

Perciò se devi riportarli a binario, non puoi spedire direttamente il byte originario?

lollo1100

dice x essere più elastico se volessi controllare il server da un hyper terminal hai qualche suggerimento ? a riguardo

lollo1100

#18
Feb 26, 2013, 04:21 pm Last Edit: Feb 26, 2013, 04:26 pm by lollo1100 Reason: 1

Quote

Hai 1 byte, mi pare di capire.


si ho 1 byte la maschera è 1 byte

scusa se volessi convertire da binario a decimale

Code: [Select]


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


leo72


dice x essere più elastico se volessi controllare il server da un hyper terminal hai qualche suggerimento ? a riguardo

Ecco, ora la cosa mi può anche tornare. Fino ad ora infatti era una conversione senza senso  :smiley-sweat:

lollo1100

Quote

Ecco, ora la cosa mi può anche tornare. Fino ad ora infatti era una conversione senza senso  :smiley-sweat:

Ha qualche suggerimento? Grazie

lollo1100

Quote

Hai 1 byte, mi pare di capire.


si ho 1 byte la maschera è 1 byte

scusa se volessi convertire da binario a decimale

Code: [Select]


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

leo72

Dovrebbe funzionare.

Sull'altra cosa, se vuoi poter inserire la gestione tramite remoto prosegui con la tua idea. Non mi vengono in mente alternative.

pablos71

secondo me dovresti solo scrivere

Code: [Select]
client.write(4); // che corrisponde a 00000100, così si che mandi 1 byte
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

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 questo
Code: [Select]

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 questo
Code: [Select]

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



Ho notato che un primo errore può essere qui
if (mask== 1)
l'ho sostituito con
if (mask== '1')

leo72

Un byte è un unsigned char.
Stai attento al confronto che fai perché gli if sono differenti:
Code: [Select]
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:
Code: [Select]
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'.

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:
Code: [Select]

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ì:
Code: [Select]
risultato = power(base, esponente);

lollo1100

#28
Feb 27, 2013, 10:32 am Last Edit: Feb 27, 2013, 10:38 am by lollo1100 Reason: 1
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ì
Code: [Select]

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

lollo1100


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:
Code: [Select]

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ì:
Code: [Select]
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? :)  

Go Up