Copia da Qbytearray a elemento di una struct & union
-
Salve, ho un problema banale ma che non riesco proprio a risolvere.
Ho una struttura + unione così definita:#pragma pack(push,1) typedef struct { char start_char[1]; uint32_t test; uint32_t time_x; uint16_t y_value; uint16_t tr_value; } csv; //Tot 13 : 1 + 4 + 4 + 2 + 2 #pragma pack(pop) union assembl { csv csv_array; char buffer_csv[13]; } united_data;
Se provo a copiare united_data.buffer_csv in un QByteArray non ho nessun problema:
arduino->read(united_data.buffer_csv, 13); QByteArray buffertemp; buffertemp = QByteArray(united_data.buffer_csv,13);
Il problema nasce quando cerco di copiare -dopo aver effettuato alcune modifiche- la variabile buffertemp in united_data.buffer_csv:
strcpy(united_data.buffer_csv, buffertemp);
oppure con
strncpy(united_data.buffer_csv, buffertemp,13);
In ogni caso copio solo il primo carattere (buffertemp.at(0)), mentre gli altri restano inalterati.
Qualche suggerimento? -
stay usando una copia per stringhe su dati grezzi.
usamemcpy
invece distrcpy
.strcpy
si ferma non appena trova 8 bits tutti messi a 0.P.S.
Per stare al sicuro io:- metterei
static_assert(sizeof(csv)==13,"Dimensione di CSV non valida");
dentro la union. - metterei un
if(arduino->bytesAvailable()>=13)
prima delarduino->read
per essere sicuri che i dati ci siano - inizializza la union a 0
assembl(){std::fill(std::begin(buffer_csv),std::end(buffer_csv),'\0');}
cosi' eviti che spazzatura sia interpretata come dati veri char start_char[1];
puo' essere semplicementechar start_char;
cosi' il default copy constructor funziona perfettamente
- metterei
-
Grazie, VRonin .
Problema risolto! ll controllo dei dati della seriale è nella parte di codice che non ho postato, mentre l'inizializzazione della union mi sembra proprio un'ottima idea.
Per sicurezza , era start_char [2] : in fondo occupa come un segnale di inizio + fine, e mi sembrava più robusto. Devo ancora valutare la cosa, magari vedendo alla fine se ho margine o meno...
Grazie ancora e buona giornata