CrazyF405: MAVLink over ELRS doesn't work out of the box, onboard ELRS port SERIAL2 has wrong defaults
Bug Report
Issue details
On the Happymodel CrazyF405HD ELRS AIO (CrazyF405, board ID 1177), the onboard ELRS receiver is wired to USART2. A freshly flashed board gets no RC input from it.
Main problem: this board can't use MAVLink over ELRS with its default parameters.
With the receiver in ELRS MAVLink mode (ELRS 4.0+), the flight controller gets no RC, no telemetry and no GCS link over ELRS. The link that is down is the same one you would use to fix the parameters, so the only way to recover is to connect USB and set SERIAL2_BAUD 460 by hand. Nothing in the ground station points to the cause.
libraries/AP_HAL_ChibiOS/hwdef/CrazyF405/hwdef.dat declares:
That makes USART2 SERIAL2, and SERIAL3 is an EMPTY slot. But the line under the USART2 pin definitions is:
This default goes to the EMPTY slot, so it does nothing. SERIAL2 keeps the generic defaults, SERIAL2_PROTOCOL 2 (MAVLink2) and SERIAL2_BAUD 57. The board README in the same directory already lists SERIAL2 as the RCIN/ELRS port (|SERIAL2|TX2/RX2|UART2 (RCIN,ELRS, internal)).
This breaks RC input in both of the receiver's serial modes, and the GCS gives no hint about the cause in either one:
- ELRS MAVLink mode (the main problem): the protocol is already right, but ELRS MAVLink runs at a fixed 460800 baud and the port is at 57600. MAVLink over ELRS is completely down: no RC via
RC_CHANNELS_OVERRIDE, no telemetry and no GCS link over ELRS. The user has to connect USB and setSERIAL2_BAUD 460by hand. - CRSF mode (the ELRS default, and how a board coming from Betaflight is set up): the port runs MAVLink2, so CRSF is never decoded and there is no RC. The user has to set
SERIAL2_PROTOCOL 23by hand.
Reproduction. For each run I flashed the .apj, factory-reset parameters (MAV_CMD_PREFLIGHT_STORAGE with param1=2), rebooted, then read RC_CHANNELS / SYS_STATUS over USB for 12–20 s. The transmitter was bound and powered the whole time.
Receiver in CRSF mode:
| Build | SERIAL2 protocol / baud after reset | RC_CHANNELS | RC receiver (SYS_STATUS) |
|---|---|---|---|
| stock | 2 / 57 | chancount 0, all zero | absent |
| RCIN default moved to SERIAL2 | 23 / 57 | 16 channels, live sticks, ELRS: Link rate 50Hz |
present, healthy |
Receiver in ELRS MAVLink mode:
SERIAL2_PROTOCOL / SERIAL2_BAUD |
RC_CHANNELS |
|---|---|
| 2 / 57 (stock defaults) | all zero (baud mismatch) |
| 2 / 460 | live sticks (via RC_CHANNELS_OVERRIDE) |
| 23 / 460 | all zero (expected: the receiver sends MAVLink, not CR |
Fix. I'm going to open a PR for this soon. It will change the bts the RCIN protocol default (which makes CRSF work out of the box, as on BETAFPV-F405, FlywooF405S-AIO and AnyleafH7) and a 4608s own baud and ignores SERIAL2_BAUD, so the baud default doesn't affect CRSF. With it, switching to MAVLink over ELRS needs only `SEd both changes on this board after a factory reset.
Related, not part of this fix: chibios_hwdef.py accepts DEFAissing SERIAL_ORDERslots without complaint. The same kind of dead default also shows up inAEDROXH7(SERIAL5, SERIAL6),DAKEFPVF40SERIAL8) and SkystarsH7HD-bdshot (SERIAL6).
I can open a separate issue for a configure-time check.
Version
ArduCopter 4.7.1 (Copter-4.7.1, dbe792162d), stock CrazyF405 build. The same lines are on master as of 2026-09-16. The bug has been there since the board was added in #28829.
Platform [ ] All [ ] AntennaTracker [ X ] Copter [ ] Plane [ ] Rover [ ] Submarine
Airframe type Quadcopter (X)
Hardware type
Happymodel CrazyF405HD ELRS 1-2S AIO (CrazyF405, APJ board ID 1177), with the onboard ELRS receiver on USART2
Logs
No flight logs: the bug shows up in the parameter defaults right after a factory reset, before any flight. The reproduction tables above list the parameter values and the RC_CHANNELS / SYS_STATUS results. I can attach parameter dumps if that helps.
Source: ArduPilot/ardupilot