Como ler 10 bytes (3 words) porta serial

Após enviar um comando pela porta serial um dispositivo sempre me responde com 10 bytes sendo os 4 primeiros um header com bytes que são sempre fixos: 0x5A , 0x5A, 0x95, 0x0A

seguidos de 3 words (2 bytes cada) ,

highbyte.valor1 , lowbyte.valor1,
highbyte.valor2 , lowbyte.valor2
highbyte.valor3 , lowbyte.valor3,

Gostaria de uma dica de como sincronizar esses dados.

Bastaria recebe-los sequencialmente ?
tipo:

highByte.valor1 = ss.read ();
lowByte.valor1 = ss.read ();

highByte.valor2 = ss.read ();
lowByte.valor2 = ss.read ();

highByte.valor3 = ss.read ();
lowByte.valor3 = ss.read ();

O computador que envia esses dados tem o mesmo formato? (endianness)

A maneira mais simples que eu encontrei para fazer isto é através de uniões.

https://www.tutorialspoint.com/cprogramming/c_unions.htm

union SerialInt{
   unsigned char bytes[2];
   int valorInt;
} valor1, valor2, valor3; 

//dentro duma função

valor1.bytes[0] = ss.read(); 
valor1.bytes[1] = ss.read(); // aqui podes inverter se a ordem dos bytes não for a mesma. 

//se quiseres usar ou imprimir o valor1, 2 ou 3, fazes: 

Serial.print("Valor 1 = ");
Serial.println(valor1.valorInt); 

// de outra forma terias de fazer byte shift. 

int valor_1_Int; 

valor_1_Int = (highByte <<8) + lowByte; //mais uma vez terias de ter em atenção a ordem dos bytes. 
1 Like