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.
    usa memcpy invece di strcpy. 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 del arduino->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 semplicemente char start_char; cosi' il default copy constructor funziona perfettamente


  • 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


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.