Skip to main content

Overview

Minimodem supports a variety of standard FSK protocols for different applications including telecommunications, amateur radio, emergency alerts, and transportation systems.

Bell System Protocols

Bell 103 (300 baud)

Classic 300 baud modem standard used in early computer communications and acoustic couplers.

Specifications

  • Baud rate: 300 bps
  • Mark frequency: 1270 Hz
  • Space frequency: 1070 Hz
  • Frequency shift: 200 Hz
  • Modulation: FSK
  • Bandwidth: 50 Hz

Framing

  • Data bits: 8 (ASCII)
  • Start bits: 1
  • Stop bits: 1
  • Total frame: 10 bits
  • Encoding: ASCII 8-N-1
Usage:
# Receive Bell 103
minimodem --rx 300

# Transmit Bell 103
echo "Hello World" | minimodem --tx 300

# With audio file
minimodem --rx --file recording.wav 300
Bell 103 originated at Bell Labs in 1962 and became the de facto standard for 300 baud modems worldwide.

Bell 202 (1200 baud)

High-speed protocol used for caller ID, packet radio, and faster data transmission.

Specifications

  • Baud rate: 1200 bps
  • Mark frequency: 1200 Hz
  • Space frequency: 2200 Hz
  • Frequency shift: -1000 Hz
  • Modulation: FSK
  • Bandwidth: 200 Hz

Framing

  • Data bits: 8 (ASCII)
  • Start bits: 1
  • Stop bits: 1
  • Total frame: 10 bits
  • Encoding: ASCII 8-N-1
Usage:
# Receive Bell 202
minimodem --rx 1200

# Transmit Bell 202
minimodem --tx 1200 < data.txt
Bell 202 is commonly used for caller ID (CLID) transmission on telephone lines between the first and second ring.

ITU-T Standards

V.21 (300 baud)

International standard similar to Bell 103 but with different frequencies.

Specifications

  • Baud rate: 300 bps
  • Mark frequency: 980 Hz
  • Space frequency: 1180 Hz
  • Frequency shift: 200 Hz
  • Modulation: FSK
  • Bandwidth: 50 Hz

Framing

  • Data bits: 8
  • Start bits: 1
  • Stop bits: 1
  • Total frame: 10 bits
  • Encoding: ASCII 8-N-1
Usage:
minimodem --rx V.21
minimodem --tx V.21 < message.txt

Telegraphy Protocols

RTTY (Radio Teletype)

Classic radioteletype protocol used extensively in amateur radio and maritime communications.

Specifications

  • Baud rate: 45.45 bps
  • Mark frequency: 1585 Hz (default)
  • Space frequency: 1415 Hz
  • Frequency shift: -170 Hz
  • Modulation: FSK
  • Bandwidth: 10 Hz

Framing

  • Data bits: 5 (Baudot)
  • Start bits: 1
  • Stop bits: 1.5
  • Total frame: 7.5 bits
  • Encoding: Baudot/ITA2
Usage:
# Receive RTTY
minimodem --rx rtty

# Transmit RTTY
minimodem --tx rtty < message.txt

# Custom RTTY frequencies
minimodem --rx --mark 2125 --space 2295 rtty
RTTY uses the 5-bit Baudot (International Telegraph Alphabet No. 2) character set with LETTERS and FIGURES shift states:
  • LETTERS mode: Standard alphabet
  • FIGURES mode: Numbers and punctuation
  • Special shift characters toggle between modes
  • Character set defined in src/baudot.c
The 45.45 baud rate comes from mechanical teleprinter limitations: 1/45.45 ≈ 22ms per bit.

TDD/TTY (Telecommunications Device for the Deaf)

Baudot-based protocol for telecommunications accessibility.

Specifications

  • Baud rate: 45.45 bps
  • Mark frequency: 1400 Hz
  • Space frequency: 1800 Hz
  • Frequency shift: 400 Hz
  • Modulation: FSK
  • Bandwidth: 10 Hz

Framing

  • Data bits: 5 (Baudot)
  • Start bits: 1
  • Stop bits: 2.0
  • Total frame: 8 bits
  • Encoding: Baudot/ITA2
Usage:
minimodem --rx tdd
minimodem --tx tdd < message.txt
TDD differs from RTTY primarily in stop bit duration (2.0 vs 1.5) and frequency pair, optimized for telephone line transmission.

Emergency Alert Systems

NOAA SAME (Specific Area Message Encoding)

Emergency alert system protocol used by NOAA Weather Radio and the Emergency Alert System.

Specifications

  • Baud rate: 520.83 bps
  • Mark frequency: 2083.33 Hz
  • Space frequency: 1562.5 Hz
  • Frequency shift: -520.83 Hz
  • Modulation: FSK
  • Bandwidth: 520.83 Hz

Framing

  • Data bits: 8
  • Start bits: 0
  • Stop bits: 0
  • Preamble: 16 × 0xAB sync bytes
  • Encoding: ASCII (specific format)
Usage:
# Receive SAME alerts
minimodem --rx same

# Decode from recorded audio
minimodem --rx --file weather_radio.wav same
Message Format:
ZCZCZCZ-ORG-EEE-PSSCCC+TTTT-JJJHHMM-LLLLLLLL-
  • ZCZCZCZ: Preamble (sync bytes 0xAB)
  • ORG: Originator code (WXR, CIV, EAS, etc.)
  • EEE: Event code (tornado warning, test, etc.)
  • PSSCCC: Location codes (up to 31 areas)
  • +TTTT: Valid time period (15-minute increments)
  • JJJHHMM: Date/time of issue (Julian day + time)
  • LLLLLLLL: Station callsign
SAME uses no framing bits. The protocol relies on sync byte detection (0xAB pattern) to identify message start.
Reference: NOAA Weather Radio SAME Documentation

Caller ID

Bell 202 Caller ID

Telephone caller identification protocol using Bell 202 modulation.

Specifications

  • Baud rate: 1200 bps
  • Mark frequency: 1200 Hz
  • Space frequency: 2200 Hz
  • Frequency shift: -1000 Hz
  • Timing: Between 1st and 2nd ring

Framing

  • Data bits: 8
  • Start bits: 1
  • Stop bits: 1
  • Protocol: SDMF or MDMF
  • Encoding: ASCII/Binary
Usage:
# Receive caller ID
minimodem --rx callerid
Caller ID mode is receive-only (--tx is not supported). The protocol uses special framing defined in databits_decode_callerid().
Minimodem automatically handles caller ID protocol decoding, including message type, length, and checksum validation.

Railway Communications

UIC-751-3 (Train/Ground)

European train control system protocol for train-to-wayside communication.

Specifications

  • Baud rate: 600 bps
  • Mark frequency: 1300 Hz
  • Space frequency: 1700 Hz
  • Frequency shift: 400 Hz
  • Modulation: FSK

Framing

  • Data bits: 39
  • Start bits: 8
  • Stop bits: 0
  • Frame format: Fixed pattern
  • Variants: Train / Ground
Usage:
# Train variant
minimodem --rx uic-train

# Ground variant
minimodem --rx uic-ground
Frame Structure:
[8 start bits: 11111111][2 fixed: 10][37 data bits][0 stop bits]
UIC mode is receive-only (--tx is not supported). Decoding uses specialized frame format validation.
Reference: EC Railway Interoperability Technical Specification

Custom Protocols

You can create custom protocols by specifying all parameters:
# Custom protocol example: 600 baud, 7-bit ASCII, 2 stop bits
minimodem --rx \
  --mark 1200 \
  --space 1800 \
  --bandwidth 100 \
  -7 \
  --startbits 1 \
  --stopbits 2 \
  600

Advanced Options

Some protocols use inverted framing (start=mark, stop=space):
minimodem --rx --invert-start-stop 300
Transmit/receive most significant bit first:
minimodem --tx --msb-first 1200
Create protocols with synchronization preambles:
minimodem --tx --sync-byte 0xAA 1200
This transmits 16 sync bytes before data payload.
Control LETTERS/FIGURES shift behavior in Baudot:
# 0 = USOS (always shift)
minimodem --rx --baudot --usos 0 45.45

# 1 = Don't shift (default)
minimodem --rx --baudot --usos 1 45.45

Protocol Comparison Table

ProtocolBaud RateMark HzSpace HzData BitsStop BitsUse Case
Bell 1033001270107081.0Classic modems
Bell 20212001200220081.0Fast data, Caller ID
V.21300980118081.0International standard
RTTY45.451585141551.5Amateur radio
TDD45.451400180052.0Accessibility
SAME520.832083.331562.580Emergency alerts
Caller ID12001200220081.0Phone ID
UIC-751-360013001700390Railway control

Binary Protocols

For raw binary data without character encoding:
# Binary output mode (hex dump format)
minimodem --rx --binary-output 1200

# Raw binary mode (specify bit count per frame)
minimodem --rx --binary-raw 16 1200
Binary modes use databits_decode_binary() instead of ASCII or Baudot decoders.

Protocol Selection Logic

Minimodem’s protocol detection in src/minimodem.c:main():
  1. Check for named protocol (rtty, tdd, same, callerid, uic, V.21)
  2. If numeric value, use as custom baud rate
  3. Apply protocol-specific defaults
  4. Override with command-line options
  5. Calculate automatic frequencies if not specified
// Example: Named protocol detection
if ( strncasecmp(modem_mode, "rtty", 5) == 0 ) {
    bfsk_databits_decode = databits_decode_baudot;
    bfsk_databits_encode = databits_encode_baudot;
    bfsk_data_rate = 45.45;
    if ( bfsk_n_data_bits == 0 )
        bfsk_n_data_bits = 5;
    if ( bfsk_nstopbits < 0 )
        bfsk_nstopbits = 1.5;
}

See Also

Build docs developers (and LLMs) love