Brauchst du die volle Auflösung von 8 bit ? Wenn du auch mit 7 auskommen könntest, könntest du das letzte Bit für _servoData immer 0 senden und das letzte Bit von _motorData immer 1. Dann kannst du beim Senden "&_servoData & 0xFE" und "&_motorData | 1", um die Bits passend zu setzen. Im Empfänger braucht es dann nur ein "if (_data & 1) motor.write(_data) else servo.write(_data);".
Wenn du die volle Auflösung von 8 bit brauchst, musst du 3 Bytes senden und ein bisschen Bits schieben. Dann eben z.b. die ersten 2 Bit als Kennzeichnung und restlichen 6 Bit als Nutzdaten. Bleiben 2 Bit unbenutzt. Also z.b.
Byte 1: 0 0 s7 s6 s5 s4 s3 s2
Byte 2: 0 1 s1 s0 m7 m6 m5 m4
Byte 3: 1 0 m3 m2 m1 m0 0 0
byte tosend[2];
tosend[0] = servo>>2;
tosend[1] = 0x40 + ((servo & 0x3) <<4 ) + (motor>>4)
tosend[2] = 0x80 + (motor & 0xf) << 2;
Wenn du dann byteweise (e) emfängst, musst du prüfen und mitzählen, ob du alles empfangen hast (complete):
byte complete=0, servov=0, motorv=0;
while(recv(&e)) {
if ((e&0xc0)==0) { servov = (servov & 0x3) | (e>>2);complete = complete | 1; }
if ((e&0xc0)==0x40) { servov = (servov & 0xfc) | ((e>>4) & 0x3);motorv = (motorv & 0xf) | (e<<4); complete = complete | 2; }
if ((e&0xc0)==0x80) { motorv = (motorv & 0xf0) | ((e>>2) & 0xf);complete = complete | 4; }
if (complete==7) { complete=0;servo.write(servo,write(servov); motor.write(motorv); }
}
PS: Der Code ist nicht ausprobiert und nur so ungefähr. & = Bitweises UND, | = Bitweises ODER, << Schieben nach links, >> Schieben nach rechts.