Unire massaggi esadecimali

Ciao a tutti

come da titolo vorrei unire due messaggi che ricevo da rs232

msg[1] contenete 01(hex) con msg[2] contenete 01(hex) per ottenetre msg12 contentente 0101(hex)

e

msg[3] contenete AC(hex) con msg[4] contenete 23(hex) per ottenetre msg34 contentente AC23(hex)

e

msg[5] contenete AC(hex) con msg[6] contenete 23(hex) per ottenetre msg56 contentente AC23(hex)

quindi sommare msg12+msg34+msg56 ed otenere in msg_sum il valore 5947001(hex)

il tutto per eseguire una verifica di trasmissione correta dei dati ricevuti ?

No ho una ricetta completa per risolvere il tuo problema, ma forse queste poche righe di codice possono darti una prima idea sul da farsi.

Si tratta di una funzione che legge una coppia di caratteri ascii esadecimali contenuti in un buffer e restituisce il rispettivo valore.

word ValHex (){                     // converte un stringa esadecimale in binario
  VarVal=0;
  for(n=1; n<3; n++){  
    car = RxBuf[RxCnt];
    RxCnt ++;                       // incrementa puntatore
    car -= 0x30;                    // toglie alfanum.
    if (car > 16 ) car -= 7;        // toglie A-F e riporta in binario
    VarVal =(VarVal * 16) + car;    // aggiunge valore
  }
  return (VarVal);
} // ValHex

Visto che avevo problemi di memoria, ho preferito definire le variabili a livello globale per poterle riutilizzare in altri passaggi.

Anche se la funzione è ormai collaudata, è sempre possibile introdurre modifiche per renderla più solida ed efficente.
Una fra tuttte la verifica se i caratteri ricevuti appartengano all’intervallo ASCII esadecimale.

E ovvio che tale funzione dovrà essere richiamata più volte, secondo i vari messaggi in arrivo.

Grazie x la riposta,

in questi giorni ho avuto modo di sperimentare ed ero arrivto alla soluzione di seguito

 verifysum = ((inByte[2]<<8) |inByte[3])+((inByte[4]<<8) |inByte[5]) +((inByte[6]<<8) |inByte[7]);

 verifysum =  verifysum <<16 ;

 verifyrx1 = (inByte[8]<<8 |inByte[9]); 

  verifyrx2 =  ( inByte[10]<<8|inByte[11]);

  verifyrx3 = ( verifyrx1<<16 | verifyrx2);

  if ( verifysum ==  verifyrx3){  // Serial.print("ok verifica   ");  
         okrx = 1;
         }

sembra funzionare molto bene, ovviamente va eseguita ad ogni ricezione e mi abilita i successivi passaggi per attuare le uscite e inviare lo stato degli input come risposta al master che lo interroga

Da quello che ho potuto capire i byte in ricezione arrivano direttamente in formato binario e pertanto il mio suggerimento non trova impiego, visto che la funzione proposta converte dati in formato esadecimale ASCII.

A presto

i dati arrivano da un plc che è il master , è sarà il master di diversi arduino

ciao