float value1 = 17.0776;
// Copia il contenuto di data in buffer usando una funzione che accetta puntatori
void copyRawFloat(uint8_t* buffer, const uint8_t* data, size_t len) {
for (size_t i = 0; i < len; ++i) {
buffer[i] = data[i];
}
}
// Ricostruisci un float a partire da un puntatore uint8_t*
// Viene usato un ciclo for per copiare ogni byte in modo da poter replicare
// il principio di funzionamento di un bus seriale dove si riceve un byte alla volta.
// Se non avessi avuto questa esigenza si poteva usare direttamente l'istruzione memcpy()
float getFloat(const uint8_t* data) {
float floatValue;
// Ottengo il puntatore alla variabile floatValue, facendo cast del puntatore
// a uint8_t* per allinearmi al tipo di dati ricevuto dalla funzione getFloat()
uint8_t* floatPtr = (uint8_t*)&floatValue;
// Copio i byte di data in flaotValue usando il puntatore per "scorrere"
// ciascuno dei 4 byte che compongono la variabile float
for (int i = 0; i < sizeof(float); i++) {
floatPtr[i] = data[i];
}
return floatValue;
}
// Funzione che stampa in esadecimale n byte di buf
// Facendo il cast del puntatore può essere chiamata con qualsiasi tipo di dati
void printByte(const char* buf, size_t len) {
for (size_t i = 0; i < len; ++i) {
Serial.print(" 0x");
Serial.print((uint8_t)buf[i], HEX);
}
Serial.println();
}
void setup() {
Serial.begin(115200);
Serial.print("value1: ");
Serial.println(value1, 4);
// Stampa ciascun singolo byte di value1
printByte((uint8_t*)&value1, sizeof(value1));
uint8_t buffer[sizeof(float)];
// Copia il contenuto di value1 nell'array di byte buffer
copyRawFloat(buffer, (uint8_t*) &value1, sizeof(float));
// Stampa il contenuto dell'array di byte buffer
Serial.println("buffer array:");
printByte(buffer, sizeof(buffer));
// Ottieni un float passando alla funzione un array (che è sempre un puntatore)
float value2 = getFloat(buffer);
Serial.print("value2: ");
Serial.println(value2, 4);
// Stampa ciascun singolo byte di value2
printByte((uint8_t*)&value2, sizeof(value2));
Serial.println("\nUso di printByte con altri tipi di variabile:");
char ch1 = 'A';
printByte((uint8_t*)&ch1, sizeof(ch1));
int int1 = -56;
printByte((uint8_t*)&int1, sizeof(int1));
long long1 = 2569745;
printByte((uint8_t*)&long1, sizeof(long1));
}
void loop() {
// put your main code here, to run repeatedly:
}