Newsgroup: it.comp.lang.c++
Titolo: Porta seriale e C++

Salve a tutti, vi pongo un quesito semplice semplice :)...
Ho realizzato un sistema su un microcontrollore, l'ultimo passo è
inviare i dati acquisiti via seriale al PC. Purtroppo i miei dati sono
di tipo FLOAT e non riesco ad inviarli in maniera semplice (a meno di
non usare decine e decine di linee di codice per convertire il FLOAT in
CHAR e quindi inviarlo al PC e poi riconvertire il tutto....). Qualcuno
ha già avuto simili problemi... Pensavo di inviare 8 bit alla volta
della variabile FLOAT (come ho fatto per trasmettere gli UNSIGNED INT a
32 bit) ma non riesco ad accedere in alcun modo ai singoli bit dato ke
le operazioni logiche sul float nn sono ammesse...
Please HELP ME!!!!!!!!!!!!!!

 wrote in message
news:1156949642.2...@i3g2000cwc.googlegroups.com

Accedere ai singoli bits e' semplice. Il problema e' che la
rappresentazione sui due sistemi di un float potrebbe differire e quindi
ti consiglio sistemi alternativi.
// qui riceveremo il float
float received_float = 0.0f;
// questo e' il float da spedire
float start = 3.47f;
// lo trattiamo come array di bytes e ne mandiamo uno alla volta:
unsigned char *float_data = reinterpret_cast<unsigned char*>(&start);
for(int i=0; i<sizeof(float); ++i)
{
	// ed uno alla volta lo copiamo su received_float:
	reinterpret_cast<unsigned char*>(&received_float)[i] = float_data[i];
}
 
// ora received_float dovrebbe contenere 3.47f
cout << received_float << endl;
come spiegato questo funziona solo se usi lo stesso processore, sistema
operativo e compilatore (e compiler settings) su entrambi i sistemi (il
sistema di start ed il sistema di received_float). Altrimenti non e'
detto funzioni.
Insomma io troverei una altro sistema... Perche' no, preferirei quello
testuale a questo!
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

romanu...@inwind.it
 ha scritto:
è un po' un problema stile C .... ma cmq
Preso atto, come già ti dissero, che la corretta trasmissione 
dei bit nella giusta sequenza è requisito necessario ma NON 
sufficiente alla integrità del dato ricevuto, la soluzione 
portabile e definitiva presuppone, in effetti, scoprire la 
rappresentazione del sistema destinatario.
Mi par di ricordare che ci siano due variabili, forse non 
altrettanto frequenti, ma pericolose che causerebbero problemi.
1) l'interpretazione di oggetti multi byte nel senso di 
ordinamento del most significant byte al less significant.
In alcune macchine gli indirizzi di memoria bassi sono assegnati 
agli uni, su altre agli altri.
2) la "endianess", ossia un fenomeno analogo, ma a livello di 
interpretazione di singoli bit in ciascun byte.
Ecco perchè la stessa stringa di, nel caso, quattro byte, può 
avere significati diversi su macchine diverse.
Se "parli" con un layer software astratto e noto a priori, tipo 
una macchina virtuale o emulatore client, il problema non 
sussiste. Altrimenti sussiste.
Detto questo, la trasmissione corretta è poi triviale.
basta usare una
union Convert
     {
     float F;
     unsigned char ArrC [sizeof (float)];
     }
per impostare il dato scrivi (assegni) la variabile F.
Per trasmetterlo, leggerlo, usi i singoli caratteri nell'array 
ArrC (che ha lo stesso indirizzo e quindi rappresenta lo stesso 
oggetto spezzettato).
Ma questo forse è il meno, se non sai che lingua binaria parla 
il client a cui trasmetti i dati.
Poi volendo fare una cosa più C++ puoi parametrizzare i metodi 
di interpretazione, ad esempio con una serie di puntatori a 
funzioni che invertano l'ordine dei byte o meno, e invertano 
l'ordine dei bit in ogni byte o meno, in funzione di risultati 
diagnostici sul sistema ricevente (devi ovviamente poter 
eseguire queste inquiry in remoto, per adattare la decodifica 
dati in situ).
ciao
Soviet_Mario


Ok! grazie mille... appena riesco ad organizzarmi con i tempi provo una
delle vostre soluzioni...
In effetti, per la cronaca, devo ridurre al minimo le istruzioni sul
microControllore e visto che i dati li invio al MatLab posso effettuare
qualsiasi,anche complessa, post elaborazione. Quindi optero' pre la
trasmissione dei singoli byte e poi la successiva decodifica via PC.
Ankora Grazie mille!!!!!!

Fatto!! La Union, di cui ignoravo completamente l'esistenza, è
perfetta per quello che avevo in mente. Sono riuscito a fare cio che
volevo ma ovviamente sono sorti nuovi problemi...ho dovuto fare una
codifica dei dati in trasmissione e ricezione (il tipo char mi codifica
solo 7 bit e non tutti ed 8), ma nulla di eccessivamente complesso.
Morale della favola: riesco a trasmettere perfettamente tutti i dati
che voglio.
Grazie mille!!