TIL what does ‘!r’ in format string mean: Python: the !r string format and the __repr__() and __str__() methods.

Some time ago I was confused by one of my colleagues stating and insisting that ExpressLRS and Crossfire are the same and both use Crossfire protocol. So I spent some time googling for that. The answer is “No”. ExpressLRS and Crossfire are different. What they have in common - they both use CRSF protocol.

Following exerts are from AnyLeaf Blog post ExpressLRS overview. AnyLeaf manufactures flight controllers, ExpressLRS receivers and other drone electronics as well as some water products.

Receivers (Rx modules) process RF signals, then pass them to the FC over a pair of UART lines. The protocol they use with the FC is Crossfire (CRSF). (CRSF is also associated with a radio system, but ELRS only uses it to communicate with the FC) This means that FC firmware that supports CRSF supports ELRS. This protocol rarely changes, so FC firmware doesn’t need to be updated to take advantage of ELRS updates.

Recall how we described how ELRS communicates with the FC using CRSF - ELRS maps its own channel configuration on CRSF’s. Unless you write or maintain FC firmware (like Betaflight), you don’t need to worry about this. Note that ELRS channels - including number of channels, what they correspond to, and their bit depth - doesn’t correspond exactly to the CRSF channels your FC reads.

Interesting issue CRSF Protocol Repo where TBS (Team Black Sheep - team behind Crossfire) discussing opening CRSF protocol and making separate repo for it.

Some details of CRSF protocol could be found in crsf.c of betaflight.

Here is WiKi CRSF Protocol in ExpressLRS repo.

If we talk about ExpressLRS - Crossfire differences, here is interesting reddit topic ELRS VS CROSSFIRE. It has very interesting links. ExpressLRS has lower latency and huge distance range.