Packet Size Reference

Radio Payload Limits

Radio FIFO Size Adafruit Header \n Delimiter Usable Payload
RFM69 66 bytes 4 bytes 1 byte 61 bytes
RFM95 252 bytes 4 bytes 1 byte 247 bytes

The configured chunk sizes in config.yml provide additional margin:

Radio Config chunk_size Effective Payload
RFM69 50 bytes 50 - 1 (\n) = 49 bytes data
RFM95 240 bytes 240 - 1 (\n) = 239 bytes data

Telemetry Packet Sizes (including 4-byte ID)

All sizes include the 4-byte identifier but exclude the \n appended by radio.py.

Packet Total Size Fits RFM69? Fits RFM95?
GYRO 16 Yes Yes
ACCL 16 Yes Yes
MAGN 16 Yes Yes
GRAV 16 Yes Yes
EULR 16 Yes Yes
BME2 16 Yes Yes
TEMP 8 Yes Yes
QUAT 20 Yes Yes
ADCS 32 Yes Yes
SOLR 36 Yes Yes
EPSS 28 Yes Yes
OBCC 8 Yes Yes
OBCR 8 Yes Yes
OBCD 8 Yes Yes
HOST 15 Yes Yes
BECN 24 Yes Yes
XFRC 8 Yes Yes

Chunked Data Sizes

For multi-packet responses (OBCP, OBCL), each chunk is:

[4-byte ID] + [payload] + [\n from radio.py]
max_chunk_payload = chunk_size - 5
Radio chunk_size ID \n Max Payload per Chunk
RFM69 50 4 1 45 bytes
RFM95 240 4 1 235 bytes

Image Packet Sizes

Image packets use a different calculation because they're text-based:

SEND[base64_data][total:04d][current:04d]
  4  +  b64_len  +    4    +     4      = total
Radio Raw Chunk Base64 + ID + Meta Total Within Limit?
RFM69 33 bytes 44 chars + 4 + 8 = 56 56 bytes Yes (< 61)
RFM95 168 bytes 224 chars + 4 + 8 = 236 236 bytes Yes (< 247)

Size Calculation Examples

RFM69 Image Packet

Raw data chunk:   33 bytes
Base64 encoded:   ceil(33/3) * 4 = 44 characters
SEND identifier:  4 bytes
Metadata:         8 bytes (4 total + 4 current)
                  ─────────
Packet total:     56 bytes
+ \n from radio:  1 byte
                  ─────────
On-air total:     57 bytes  (< 66 byte FIFO limit)

RFM69 OBCP Chunk

OBCP identifier:  4 bytes
Text payload:     45 bytes max
                  ─────────
Packet total:     49 bytes
+ \n from radio:  1 byte
                  ─────────
On-air total:     50 bytes  (= chunk_size config)

Exceeding Limits

If a packet exceeds the radio FIFO size, the Adafruit library raises an AssertionError. This most commonly occurs with:

  • Image packets when chunk sizes aren't properly tuned
  • OBC process/file listing chunks when using the wrong default size
  • Any packet that doesn't account for the 4-byte Adafruit header + 1-byte \n

The chunk_data() function in main.py automatically calculates the correct max payload size based on the active radio's chunk size configuration.