Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Copia da Qbytearray a elemento di una struct & union
Forum Updated to NodeBB v4.3 + New Features

Copia da Qbytearray a elemento di una struct & union

Scheduled Pinned Locked Moved Solved Italian
3 Posts 2 Posters 714 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • lagodolioL Offline
    lagodolioL Offline
    lagodolio
    wrote on last edited by
    #1

    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?

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by VRonin
      #2

      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

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      0
      • lagodolioL Offline
        lagodolioL Offline
        lagodolio
        wrote on last edited by
        #3

        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

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved