Passthrough telemetry over CRSF (crossfire)

This is to track development and testing of a custom telemetry implementation over CRSF, the goal is to have something equivalent to the frsky passthrough protocol.
The CRSF protocol has been added recently (as of Oct 2020) to ArduPilot by @andyp1per.
Like fport CRSF can carry both RC and bidirectional telemetry.
The CRSF receiver can be wired to an ArduPilot FC in 2 ways, by using RCIN or by using a serial port (SERIAL_PROTOCOL=23).
For telemetry support it requires the usage of a serial port, again just like fport.
CRSF native telemetry is supported by OpenTX as sensors, so users would normally have to discover and display them on widgets or telemetry pages.
This works really well but unfortunately CRSF native telemetry does not support all the telemetry data that passthrough offers.

Some further notes:

  • passthrough over frsky has a limit of 8 bytes per frame so there is no way of sending large text strings as a single frame whereas CRSF has a limit of 64bytes per frame.
  • gps telemetry is already supported by CRSF native telemetry so no need to duplicate the functionality
  • CRSF has 2 telemetry rates: mode 1 @50Hz and mode 2 @150Hz. The problem is @50Hz, bandwidth is limited and the RX will discard frames. With native CRSF telemetry you get a slow down of sensor refresh, with custom telemetry we’ll loose some status text messages and we get a slower refresh as well.

My proposed solution

I created 2 custom CRSF telemetry frames, one to carry the very same passthrough payload used by frsky in order to maximize code reuse both in ArduPilot and in OpenTX and another one to carry status text messages as a single big frame.

Having a dedicated frame for status text has the added benefit that when the CRSF link switches from high data rate to low data rate we do not get status text corruption (we might miss a whole status text message if the frame is dropped but at least it’s not corrupted).

Since GPS and status text have their own frames we never send them as passthrough data.

When we detect a switch to slow data rate we dynamically adjust message rates to cope with the slower link, we can for instance lower passthrough attitude rate which is usually quite high.


  • CRSF native telemetry always enabled
  • CRSF custom telemetry uses frame ID 0x7F as suggested by TBS
  • CRSF custom telemetry in RF mode 1 uses a single big frame every couple seconds to pack all passthrough frames as an array. This leaves enough bandwidth for native CRSF telemetry, status text messages and passtrough, the only side effect is the artificial horizon is unusable while in RF mode 1 but everything else is updated every 3 seconds on average.

Rates in RF Mode 2:

  • native GPS 3Hz
  • native BATTERY 1Hz
  • native ATTITUDE 1Hz
  • native FLIGHT_MODE 0.5Hz
  • native HEARTBEAT 0.2Hz
  • custom STATUSTEXT 2Hz
  • custom PASSTHROUGH 20 Hz

Rates in RF mode 1:

  • native GPS 1Hz
  • native BATTERY 1Hz
  • native ATTITUDE 1Hz
  • native FLIGHT_MODE 0.5Hz
  • native HEARTBEAT 0.2Hz
  • custom STATUS_TEXT 0.5Hz
  • custom PASSTHROUGH 0.5Hz (1 frame with all passthrough packets as an array)

On the OpenTX side I’ve added support for the new message types to my widgets and customized the rssi view to include rssi, link quality (rx/tx) and rf mode (fast/slow data rate)

Overall the look and feel of the widget is the usual one except for the extended rssi info (RQly, TQly, RSSI/RFMD)


Open issues:

  • better handling of rf mode 1 (done in dev branch, needs testing)

Ardupilot setup:

  • RC_OPTIONS bit 8 set at 1, i.e. add 256 to your current RC_OPTIONS value (enables custom CRSF telemetry)

Widget setup:

  • enter the config menu, long press SYS, browse to tools, launch “Yaapu Config” and enable CRSF, long press RTN to exit and save, should be ok, if not simply power cycle.

Downloading and testing (latest ardupilot version 0.8, widget and script 0.7)

  • you can compile it yourself using my test branch (flash cost right now is around 1KB)
  • prebuilt ardupilot binaries are here
  • Yaapu Telemetry Widget with crossfire for Horus class radios is here
  • Yaapu Telemetry Script with crossfire for Taranis radios is here

Note: I really need to thank TBS for supporting this with a micro TX V2 and a nano receiver!



Will this also work if you use mavlink telemetry with your crossfire reciever.
Currently I have a 15" mapping drone running copter and using a tbs diversity reciever.
The reciever uses sbus for rc. I see there seems to be crsf support for ardupilot, but have not come across it yet… (will dive into it)
I have another serial port on the fc connected to the reciever using mavlink.
Since I have a full size crossfire module I can use bluetooth or wifi to connect mission planner or qgroundcontrol wireless to the crossfire module.
It would be nice to also be able to use the yaapu telemetry script on my opentx radio so I dont always have to use a groundstation to see telemetry.

Hi Peter, I’m in no way a crossfire expert :slight_smile:
All I have for testing is a MicroTX V2 and a nano receiver, and indeed for my solution to work you will need CRSF.
I don’t know if your Full TX is capable of simultaneous mavlink + CRSF native telemetry, you’ll have to test it yourself

1 Like

@yaapu that is awesome news, thanks for your effort on this! i‘ll be testing asap, new transmitter due to be delivered within next 48hrs. time to replace the X9D finally…

1 Like

I just finished building a 7" test quad with copter to test mavlink over wifi and test rc over mavlink with crossfire 4.x
The plan was also to test if I could get your script to work with it.
I’ll see if I can also test this for you.
Do I need a special build for my fc to check this out?

@yaapu on a sidenote i’m currently working on the CRSF documentation. i’ve taken the liberty to grab the valuable information about pt over crsf from your initial post and add it to the wiki PR
review and comments appreciated.

cheers, basti.

1 Like

Hi Peter, you need to compile my branch or you can simply flash one of the firmwares I linked in the first post

1 Like

No worries and thank you, I’l read it and comment if needed!

There’s also this pending: not sure what @hwurzburg wants to do with it

@andyp1per ah great, missed that one;) we might get the content joined somehow, subject to your and @hwurzburg approval.

Hi all,
I added crossfire support to Taranis X9D and Taranis Lite/QX7/X-Lite versions of my script, check the opening post for download links,



Its already in the wiki…under upcoming features…ie things that are not in a stable release yet…

The best of both worlds together?
CRSF + yaapu- telemetry :slight_smile:
A dream comes true.
Thanks a lot.

Keep going with this wonderful work.

PS: Do you ever sleep?

1 Like

I was almost giving up on crsf telemetry. Thanks Alex !

…haha never give up :_)

1 Like

Fantastic, thanks a lot! Having used Yaapu + SmartPort with FrSky, creating my own telemetry screens really felt like a trip back in time after I switched to Crossfire. :wink: Now it all comes together. :+1:

1 Like

@yaapu having the script for taranis ready noticeably increased the pressure;)

needless to say this is basically as awesome as expected:

my test-setup:


crsf microtxv2
nanorx (non-diversity)
taranis X9D oldschool nonplus non-bling first batch type of transmitter

everything works like a charm under indoor workbench conditions. however, i can reliably get the telemetry to freeze as soon as i go outside and get a sat fix. this seems to stall the passthrough message set, while the proprietary crsf messages (linkt stats etc) keep their expected rate.

on a sidenote, the RSSI layout seems to kill one and a half digits.

thanks again for your great work, this is the first time i’m really using your script and it’s majorly awesome!

Hi, thanks for testing!
my test setup is an exact copy of yours :slight_smile:

Did it switch to mode 1 when you went outside?

no, stays in RFMD 2, not testing at range atm.
it‘s like the telem screen freezing as soon as gps gets a 3d fix

Can’t reproduce it, it’s super smooth here in mode 2, could have been the script that froze? I had it running a couple hours before releasing it but could be.

Edit: works with 3d sat fix