Fix message framing (backtracking parser) #225
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes an issue where the parser can detect a STX byte that's not really a start of frame marker, but a random byte in the middle of a message, and then consume the next (few) real start-of-frame marker(s) as part of the incorrectly identified frame.
This situation can happen upon (re)connection or over lossy connections (e.g. radio) where some bytes are occasionally lost.
Although the parser will most likely resynchronise at some point (not guaranteed), this issue will still cause the loss of messages that have otherwise been correctly received in full.
The solution implemented is to use a buffered/peekable reader that can backtrack once the CRC is found to be incorrect.
In addition, this PR moves the CRC check to
read_vX_message_raw
, which ensures that a call to this function will always produce a valid Mavlink frame (raw message).fixes #222