The MAVLink protocol has HEADER + PAYLOAD + SIGNATURE format.
MAVLink v1.0
v1.0 is the standard protocol as specified by QGroundControl. It has the format:
- 6 bytes header
- (PAYLOAD length) bytes payload
- 2 bytes signature (checksum)
The first byte is always the protocol start-of-frame: 0xFE
The second byte is always the payload length.
Hence your receive buffer size should be (PAYLOAD length) + 8.
The method you described will generally work for most packets received from the pixhawk. However, pixhawk (ArduPilot) makes use of an extended MAVLink protocol which has been coined "v2.0" which adds additional header and signature bytes.
MAVLink v2.0
v2.0 is the extended protocol which applies to a select few messages such as "STATUSTEXT". It has the format:
- 10 bytes header
- (PAYLOAD length) bytes payload
- 15 bytes signature
The first byte has the start-of-frame: 0xFD
The second byte is again the payload length.
Hence, your buffer size should be (PAYLOAD length) + 25.
If you want to process MAVLink message data from the pixhawk, or from the generated .tlog file you should set your input message buffer size based on the start of frame and payload length bytes, the first two bytes of any MAVLink message.