Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Solved Copia da Qbytearray a elemento di una struct & union

    Italian
    2
    3
    540
    Loading More Posts
    • 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.
    • lagodolio
      lagodolio last edited by

      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 Reply Quote 0
      • VRonin
        VRonin last edited by VRonin

        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 Reply Quote 0
        • lagodolio
          lagodolio last edited by

          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 Reply Quote 0
          • First post
            Last post