Documentation Index
Fetch the complete documentation index at: https://mintlify.com/kamalmostafa/minimodem/llms.txt
Use this file to discover all available pages before exploring further.
Overview
This guide provides complete, practical examples of transferring various types of data using minimodem. Whether you’re sending text over a radio link, transferring files via telephone, or creating an acoustic coupler, these workflows demonstrate real-world data transfer scenarios.
Text Transfer
Simple Text Message
The most basic use case - sending and receiving text messages:
# Send a simple message
echo "Hello World" | minimodem --tx 1200
# Send multi-line text
cat message.txt | minimodem --tx 1200
# Interactive typing
minimodem --tx 1200
# Type your message and press Ctrl+D when done
# Receive and display
minimodem --rx 1200
# Receive and save to file
minimodem --rx 1200 > received.txt
# Receive quietly (no status messages)
minimodem --rx 1200 --quiet 2>/dev/null > received.txt
# Create audio file
echo "Test Message" | minimodem --tx 1200 -f test.wav
# Decode audio file
minimodem --rx 1200 -f test.wav
# Verify output
minimodem --rx 1200 -f test.wav --quiet 2>/dev/null
# Should output: Test Message
Reliable Text Transfer
Add error detection and correction:
Prepare message with checksum
# Create message with MD5 checksum
MESSAGE="Important data here"
CHECKSUM=$(echo -n "$MESSAGE" | md5sum | cut -d' ' -f1)
echo "${MESSAGE}|${CHECKSUM}"
Transmit with verification
# Send message with checksum
echo "${MESSAGE}|${CHECKSUM}" | minimodem --tx 1200
Receive and verify
# Receive message
RECEIVED=$(minimodem --rx 1200 --quiet 2>/dev/null)
# Split message and checksum
DATA=$(echo "$RECEIVED" | cut -d'|' -f1)
RECV_CHECKSUM=$(echo "$RECEIVED" | cut -d'|' -f2)
# Verify
CALC_CHECKSUM=$(echo -n "$DATA" | md5sum | cut -d' ' -f1)
if [ "$RECV_CHECKSUM" = "$CALC_CHECKSUM" ]; then
echo "Verified: $DATA"
else
echo "ERROR: Checksum mismatch"
fi
File Transfer
Binary File Transfer
Transfer any file using Base64 encoding:
Transmit File
Receive File
Verify Transfer
# Encode and transmit
base64 document.pdf | minimodem --tx 1200
# With progress indication (requires pv)
cat document.pdf | base64 | pv | minimodem --tx 1200
# Save transmission to audio file
base64 document.pdf | minimodem --tx 1200 -f transfer.wav
# Receive and decode
minimodem --rx 1200 --quiet 2>/dev/null | base64 -d > received.pdf
# From audio file
minimodem --rx 1200 -f transfer.wav --quiet 2>/dev/null | \
base64 -d > received.pdf
# Compare checksums
md5sum document.pdf
md5sum received.pdf
# Or use sha256
sha256sum document.pdf received.pdf
# Verify files are identical
if cmp -s document.pdf received.pdf; then
echo "Transfer successful!"
else
echo "Transfer failed - files differ"
fi
Compressed File Transfer
Reduce transfer time with compression:
# Transmit compressed
gzip -c largefile.txt | base64 | minimodem --tx 1200
# Receive and decompress
minimodem --rx 1200 --quiet 2>/dev/null | base64 -d | gunzip > largefile.txt
# Calculate transfer time
FILE_SIZE=$(wc -c < largefile.txt)
BAUD_RATE=1200
TRANSFER_TIME=$((FILE_SIZE * 10 / BAUD_RATE)) # 10 bits per byte
echo "Estimated transfer time: ${TRANSFER_TIME} seconds"
Chunked Transfer
Transfer large files in chunks with verification:
#!/bin/bash
# chunked-transfer.sh - Transfer file in verified chunks
FILE="$1"
CHUNK_SIZE=1024 # bytes
BAUD=1200
# Split file
split -b $CHUNK_SIZE "$FILE" chunk_
# Transmit each chunk
for chunk in chunk_*; do
echo "Sending $chunk..."
(
echo "CHUNK:$(basename $chunk)"
cat "$chunk" | base64
echo "MD5:$(md5sum $chunk | cut -d' ' -f1)"
echo "END"
) | minimodem --tx $BAUD
# Wait for acknowledgment (implement as needed)
sleep 1
done
echo "Transfer complete"
rm chunk_*
Receiver script:
#!/bin/bash
# receive-chunks.sh - Receive and verify chunks
BAUD=1200
OUTPUT="received_file"
while true; do
# Receive chunk
DATA=$(minimodem --rx $BAUD --rx-one --quiet 2>/dev/null)
# Extract chunk info
CHUNK_NAME=$(echo "$DATA" | grep "^CHUNK:" | cut -d: -f2)
CHUNK_DATA=$(echo "$DATA" | sed -n '/^CHUNK:/,/^MD5:/p' | grep -v "^CHUNK:" | grep -v "^MD5:")
CHUNK_MD5=$(echo "$DATA" | grep "^MD5:" | cut -d: -f2)
# Decode and verify
echo "$CHUNK_DATA" | base64 -d > "$CHUNK_NAME"
CALC_MD5=$(md5sum "$CHUNK_NAME" | cut -d' ' -f1)
if [ "$CHUNK_MD5" = "$CALC_MD5" ]; then
echo "$CHUNK_NAME verified OK"
cat "$CHUNK_NAME" >> "$OUTPUT"
rm "$CHUNK_NAME"
else
echo "$CHUNK_NAME FAILED verification"
# Request retransmit
fi
# Check for end
echo "$DATA" | grep -q "^END$" && break
done
echo "File received: $OUTPUT"
Two-Way Communication
Half-Duplex Communication
Simple back-and-forth communication:
Station A
Station B
Automated Script
# Send message
echo "This is Station A, over" | minimodem --tx 300
# Wait for reply
echo "Listening..."
minimodem --rx 300 --rx-one
# Receive message
echo "Listening..."
minimodem --rx 300 --rx-one
# Send reply
echo "Station A, this is Station B, over" | minimodem --tx 300
#!/bin/bash
# half-duplex-chat.sh
while true; do
echo -n "You: "
read message
echo "$message" | minimodem --tx 300
echo "Them: "
minimodem --rx 300 --rx-one
done
Full-Duplex Simulation
Simulate full-duplex using different frequencies:
# Terminal 1: Transmit on 1200 Hz, receive on 2200 Hz
(
minimodem --rx 300 --mark 2270 --space 2070 &
minimodem --tx 300 --mark 1270 --space 1070
)
# Terminal 2: Transmit on 2200 Hz, receive on 1200 Hz
(
minimodem --rx 300 --mark 1270 --space 1070 &
minimodem --tx 300 --mark 2270 --space 2070
)
Radio Communication
HF Radio Transfer
Optimized for shortwave radio conditions:
# Transmit at 300 baud (more reliable for HF)
echo "CQ CQ CQ DE W1ABC" | minimodem --tx 300
# Receive with auto-carrier (handles frequency drift)
minimodem --rx 300 --auto-carrier --confidence 1.0
# RTTY mode for amateur radio
echo "DE W1ABC" | minimodem --tx rtty
minimodem --rx rtty --auto-carrier
VHF/UHF Radio Transfer
Higher speed for VHF/UHF FM:
# Transmit at 1200 baud (APRS/Packet radio speeds)
echo "Data packet" | minimodem --tx 1200
# With continuous carrier (important for FM radio)
cat data.txt | minimodem --tx 1200 --tx-carrier
# Receive with tight bandwidth
minimodem --rx 1200 --bandwidth 200
Weather Radio Reception
Decode NOAA SAME alerts:
# Receive SAME headers
minimodem --rx same --auto-carrier > alerts.txt
# From recorded audio
minimodem --rx same -f weather-recording.wav > decoded-alerts.txt
# Parse SAME message
# Format: ZCZC-ORG-EEE-PSSCCC+TTTT-JJJHHMM-LLLLLLLL-
Telephone/Modem Transfer
Classic Modem Emulation
Emulate a classic dial-up modem:
# Bell 103 (300 baud) - Original modem standard
echo "Data" | minimodem --tx 300
minimodem --rx 300
# Bell 202 (1200 baud) - Faster modem standard
echo "Data" | minimodem --tx 1200
minimodem --rx 1200
# V.21 (300 baud) - International standard
echo "Data" | minimodem --tx 300 --mark 980 --space 1180
minimodem --rx 300 --mark 980 --space 1180
Caller ID Decoding
Decode telephone caller ID:
# Record caller ID from phone line
minimodem --rx callerid -f phone-recording.wav
# Real-time caller ID (if you have phone line connected)
minimodem --rx callerid
Acoustic Coupling
Speaker-to-Microphone Transfer
Transfer data acoustically between devices:
Position devices
Place speaker of transmitting device near microphone of receiving device
Calibrate volume
# Transmitter: Test tone
echo "TEST" | minimodem --tx 300 --volume 0.7
# Receiver: Monitor levels
minimodem --rx 300
# Adjust transmit volume until carrier is detected reliably
Transfer data
# Transmitter
cat data.txt | minimodem --tx 300 --volume 0.7
# Receiver
minimodem --rx 300 > received.txt
Acoustic Coupling Tips:
- Use 300 baud for better reliability
- Minimize background noise
- Use medium volume (0.5-0.7) to avoid distortion
- Keep devices stable and close together
Air-Gapped Transfer
Transfer data between isolated systems:
# Isolated system (transmit)
cat secret-data.txt | base64 | minimodem --tx 300 -f transfer.wav
# Physically move audio file (USB stick, etc.)
# Connected system (receive)
minimodem --rx 300 -f transfer.wav --quiet 2>/dev/null | base64 -d > secret-data.txt
Specialized Protocols
RTTY for Amateur Radio
# Transmit RTTY (45.45 baud, 1.5 stop bits)
echo "CQ CQ CQ DE W1ABC W1ABC K" | minimodem --tx rtty
# Receive RTTY with custom shift
minimodem --rx rtty --mark 2125 --space 2295
# TDD mode (45.45 baud, 2.0 stop bits)
echo "GA" | minimodem --tx tdd
minimodem --rx tdd
UIC Train Communication
Decode European train-to-ground communication:
# Train-to-ground decoder
minimodem --rx uic-train -f train-recording.wav
# Ground-to-train decoder
minimodem --rx uic-ground -f ground-recording.wav
Custom Protocols
Create custom framing:
# Custom start/stop bits
echo "DATA" | minimodem --tx 1200 \
--startbits 2 \
--stopbits 2.0
minimodem --rx 1200 \
--startbits 2 \
--stopbits 2.0
# Custom frequencies
echo "DATA" | minimodem --tx 1200 \
--mark 1000 \
--space 2000
minimodem --rx 1200 \
--mark 1000 \
--space 2000
# Raw binary (no framing)
echo "DATA" | minimodem --tx 1200 \
--startbits 0 \
--stopbits 0 \
--binary-raw 8
Speed vs Reliability
Maximum Reliability
Balanced
Maximum Speed
# 300 baud, narrow bandwidth, high threshold
echo "Critical data" | minimodem --tx 300
minimodem --rx 300 --bandwidth 50 --confidence 2.0
# Use for:
# - Noisy environments
# - Long-distance HF radio
# - Acoustic coupling
# - Low signal strength
# 1200 baud, standard settings
echo "Regular data" | minimodem --tx 1200
minimodem --rx 1200
# Use for:
# - General purpose
# - VHF/UHF FM radio
# - Good audio connections
# - Moderate distances
# Custom high baud rate
echo "Fast data" | minimodem --tx 4800
minimodem --rx 4800 --bandwidth 300 --confidence 1.2
# Use for:
# - Clean audio paths
# - Short distances
# - Wired connections
# - Large file transfers
Transfer Time Estimation
#!/bin/bash
# estimate-transfer-time.sh
FILE="$1"
BAUD="${2:-1200}"
# Calculate file size
FILE_SIZE=$(wc -c < "$FILE")
# Account for Base64 encoding (33% overhead)
ENCODED_SIZE=$((FILE_SIZE * 4 / 3))
# Account for framing (10 bits per 8 data bits)
TOTAL_BITS=$((ENCODED_SIZE * 10))
# Calculate transfer time
TRANSFER_SECONDS=$((TOTAL_BITS / BAUD))
MINUTES=$((TRANSFER_SECONDS / 60))
SECONDS=$((TRANSFER_SECONDS % 60))
echo "File: $FILE"
echo "Size: $FILE_SIZE bytes"
echo "Encoded size: $ENCODED_SIZE bytes"
echo "Baud rate: $BAUD"
echo "Estimated transfer time: ${MINUTES}m ${SECONDS}s"
Usage:
./estimate-transfer-time.sh document.pdf 1200
# File: document.pdf
# Size: 102400 bytes
# Encoded size: 136533 bytes
# Baud rate: 1200
# Estimated transfer time: 18m 58s
Error Handling
Retry on Failure
#!/bin/bash
# retry-transfer.sh - Retry transmission until successful
FILE="$1"
MAX_RETRIES=3
BAUD=1200
# Calculate checksum
CHECKSUM=$(md5sum "$FILE" | cut -d' ' -f1)
for ((i=1; i<=MAX_RETRIES; i++)); do
echo "Attempt $i of $MAX_RETRIES..."
# Transmit file with checksum
(
base64 "$FILE"
echo "CHECKSUM:$CHECKSUM"
) | minimodem --tx $BAUD
# Wait for acknowledgment
echo "Waiting for acknowledgment..."
ACK=$(timeout 30 minimodem --rx $BAUD --rx-one --quiet 2>/dev/null)
if echo "$ACK" | grep -q "^OK:$CHECKSUM$"; then
echo "Transfer successful!"
exit 0
else
echo "Transfer failed, retrying..."
sleep 2
fi
done
echo "Transfer failed after $MAX_RETRIES attempts"
exit 1
Automatic Error Correction
# Use forward error correction (FEC) with par2
par2create -r10 file.bin
# Transmit file and parity
cat file.bin | base64 | minimodem --tx 1200
cat file.bin.par2 | base64 | minimodem --tx 1200
# Receive and repair
minimodem --rx 1200 --quiet 2>/dev/null | base64 -d > received.bin
minimodem --rx 1200 --quiet 2>/dev/null | base64 -d > received.bin.par2
par2repair received.bin
Monitoring and Debugging
Transfer Monitoring
# Monitor transfer with statistics
minimodem --rx 1200 | tee received.txt
# Log status messages
minimodem --rx 1200 > received.txt 2> transfer.log
# Parse logs for statistics
grep "NOCARRIER" transfer.log | awk '{print $4, $5, $6}'
Audio Debugging
# Record transmitted audio for analysis
echo "TEST" | minimodem --tx 1200 -f test.wav
# Analyze with spectral view
ffmpeg -i test.wav -lavfi showspectrumpic=s=1024x512 spectrum.png
# Or use sonic-visualizer, audacity, etc.
audacity test.wav
See Also