Understanding UART Conflicts: How to Fix Resource Busy Errors in Betaflight

# Understanding UART Conflicts: How to Fix Resource Busy Errors in Betaflight

You plug in your GPS, wire it to UART 3, enable it in the Ports tab, and save. Betaflight throws a red error: “**Resource Busy — UART already in use**” or silently fails to communicate with your new peripheral. UART conflicts are one of the most frustrating Betaflight issues because the error messages are often vague and the root cause is buried in resource assignments that Betaflight inferred automatically. This guide demystifies UARTs, explains how resource conflicts happen, and shows you exactly how to fix them using the Betaflight CLI.

## What Is a UART and Why Do Conflicts Happen?

A UART (Universal Asynchronous Receiver-Transmitter) is a hardware serial port on your flight controller’s microcontroller (MCU). Each UART has a physical TX (transmit) and RX (receive) pin that you can use to connect one peripheral — a receiver, GPS, VTX SmartAudio, ESC telemetry, or a camera control wire.

**The problem:** Most F4 and F7 flight controllers have 3-6 UARTs, but many peripherals compete for them. Betaflight also assigns some UARTs to built-in functions by default (USB VCP, Serial RX inversion, SoftSerial), and it is easy to unknowingly consume more UARTs than your board physically supports.

## UART Capacity by Flight Controller Type

| FC Type | Typical UART Count | Notes |
|———|——————-|——-|
| F4 (basic) | 3-5 UARTs | Some share pins with I2C or SoftSerial |
| F7 (standard) | 5-8 UARTs | More flexible pin mapping |
| H7 (high-end) | 8+ UARTs | Rarely run out of ports |
| AIO Whoop Board | 1-2 UARTs | Very limited — plan peripheral choices carefully |

## Common Peripheral UART Requirements

| Peripheral | UARTs Consumed | Notes |
|———–|—————|——-|
| Serial RX (ELRS, Crossfire, FrSky) | 1 | Typically UART 1 or 2 by default |
| GPS | 1 | Needs both TX and RX |
| SmartAudio / Tramp VTX | 1 | TX only (one-way communication) |
| ESC Telemetry | 1 | RX only (one-way from ESC to FC) |
| Camera Control (RunCam Device) | 1 | RX only |
| MSP (for external OSD, Bluetooth) | 1 | Configurable; often shares UART with other functions |
| USB (VCP) | 1 | Dedicated — not user-configurable |

Many pilots need 3-4 UARTs: Serial RX (1), GPS (2), SmartAudio VTX (3), and optionally ESC Telemetry (4). On an F4 board with only 3 UARTs, this already creates a conflict.

## Diagnosing a UART Conflict

### Method 1: Check the Ports Tab
In the Betaflight **Ports** tab, each UART row shows which functions are assigned. If a UART already has Serial RX or MSP enabled and you try to add GPS to the same UART, Betaflight may refuse to save or silently override your setting.

### Method 2: CLI Resource Mapping
The definitive way to see what’s using each UART is through the CLI:

“`
resource
“`

Look for lines like:
“`
A09: SERIAL_TX 3
A10: SERIAL_RX 3
B10: SERIAL_TX 6
B11: SERIAL_RX 6
“`

This tells you which MCU pins map to which UARTs. If a pin is already assigned to a function like `LED_STRIP` or `I2C_SCL`, that UART is unavailable.

### Method 3: DMA and Timer Conflicts
Some UARTs share DMA channels or timers with motor outputs. Enabling a UART that conflicts with a motor resource can cause erratic motor behavior or failure to arm. Check:

“`
dma show
timer show
“`

## Step-by-Step Conflict Resolution

### Step 1: List Current Resource Assignments

In the CLI:
“`
resource show all
“`

This displays every MCU pin and its current function. Look for UART TX/RX pins and note which ones are already assigned.

### Step 2: Identify Available UARTs

Compare the resource list against your board’s pinout diagram. Pins shown as `FREE` or with `SERIAL_TX N` / `SERIAL_RX N` that are not currently used in the Ports tab are candidates.

### Step 3: Free Up Conflicting Resources

If the UART you want is occupied by a function you don’t use, free it:

“`
resource LED_STRIP 1 NONE
resource I2C_SCL 1 NONE
resource I2C_SDA 1 NONE
“`

This frees MCU pins by disabling unused features. Common resource hogs:

| Function to Disable | Why |
|——————–|—–|
| LED_STRIP | Frees a pin often shared with UART 5 or 6 |
| I2C (magnetometer) | Frees 2 pins if you don’t use a compass |
| CAMERA_CONTROL | Frees 1 pin if you don’t use RunCam device control |
| PINIO (user1/user2) | Frees pins used for VTX power switching |
| SERVO outputs | Frees timer resources on fixed-wing FCs used for quads |

### Step 4: Reassign UART Pins (F7/H7 Only)

On F7 and H7 flight controllers, you can remap UARTs to different physical pins. On F4, UART pins are fixed and cannot be remapped.

“`
# Example: Move UART 6 TX to a free pin on F7
resource SERIAL_TX 6 C08
save
“`

### Step 5: Use SoftSerial as a Last Resort

SoftSerial creates a software-based UART (not hardware-accelerated) on any free pin. It’s slower and uses more CPU, but it works for low-bandwidth functions like SmartAudio:

“`
feature SOFTSERIAL
resource SOFTSERIAL_TX 1 B06 # Assign to any free pin
save
“`

After reboot, a new “SOFTSERIAL1” row appears in the Ports tab. **Use SoftSerial only for SmartAudio or Camera Control** — NOT for GPS or Serial RX (too slow, data loss).

## Common UART Conflict Scenarios and Fixes

| Scenario | Error/Symptom | Fix |
|———-|————-|—–|
| GPS + Serial RX both want UART 3 | GPS won’t get fix or RX stops working | Move GPS to a free UART |
| SmartAudio on same UART as GPS | VTX control works but GPS telemetry is corrupted | Move SmartAudio to SoftSerial |
| ESC Telemetry conflicts with LED Strip | RPM filter shows errors, LED won’t light | Disable LED_STRIP, free pin for ESC telemetry |
| Bluetooth module and Serial RX conflict | Both use UART 1 — only one works | Use UART 1 for RX, move Bluetooth to another UART or SoftSerial |
| “resource SERIAL_TX 10 out of range” | Requesting a UART your MCU doesn’t have | Check your board’s actual UART count — not all advertised ports exist |

## The “DMA Not Available” Warning

If you see “DMA not available on UART X” when enabling a peripheral, the UART will work but may cause slight motor timing jitter. For GPS and SmartAudio (low data rate), this is usually fine. For Serial RX (high data rate), always use a DMA-capable UART. Check with:
“`
dma show
“`

## Preventing Future Conflicts

– **Plan your build’s UART usage before soldering.** Draw a table mapping each peripheral to a UART.
– **Check your FC’s pinout diagram** for shared function pins (pads labeled “TX3/RX3” may also be labeled “SDA/SCL” for I2C).
– **Save a CLI dump** of a working configuration so you can restore if a UART conflict breaks things.

For builds that demand maximum UART flexibility, the [UAVModel F7 Flight Controller](https://uavmodel.com) provides 6 fully remappable UARTs plus dedicated pads for I2C and LED Strip — no resource sharing required. Combined with clearly labeled silkscreen pinouts, you can confidently wire GPS, VTX control, camera control, ESC telemetry, and Serial RX without a single resource conflict.

## Video Guide

Leave a Comment

Scroll to Top