hello@differentgravy.uk — no ticket system, no bot, no autoresponder. A real engineer, usually within 48 hours.
If you think you've found a bug, tell us what OS you're on and which variant you have. A screenshot of your terminal helps.
Everything you need to put one on your bench and get it working. No hunting through PDFs. No dead driver links.
Important: the DG-UART does not power your target. Give your target board its own supply before connecting.
Before you wire anything to your target, check the OS has enumerated the device and assigned a port. Pick your platform:
Terminal · zsh / bash
# Plug the DG-UART in, then list USB-serial devices:
ls -1 /dev/cu.usbserial-* 2>/dev/null
# More detail — confirm it's the FTDI chip:
ioreg -p IOUSB -l -w 0 | grep -A 5 'FT232\|FTDI'
# You should see a line like:
# /dev/cu.usbserial-AB0XYZ12
If ls returns nothing, the OS hasn't seen the device. Try a different USB-C cable — charge-only cables will not enumerate.
Terminal · bash
# After plug-in, find the new tty:
ls -1 /dev/ttyUSB* 2>/dev/null
# Confirm the kernel saw it and which driver attached:
dmesg | tail -20 | grep -E 'ftdi|usb'
# Confirm vendor / product over USB:
lsusb | grep -i 'future technology'
# Expected output ends with something like:
# Bus 001 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial
Most distributions need your user in the dialout group before the port is openable. Add yourself once: sudo usermod -a -G dialout $USER, then log out and back in (or run newgrp dialout for the current shell).
PowerShell (run as user, not admin)
# List USB serial ports — modern PowerShell:
Get-PnpDevice -Class Ports | Where-Object { $_.FriendlyName -like '*USB Serial*' }
# WMI fallback for older systems:
Get-WmiObject Win32_SerialPort | Select-Object DeviceID, Description
# You should see one entry, something like:
# COM3 USB Serial Port (COM3)
If nothing shows up, open Device Manager and look for an entry under Other devices with a yellow warning. That means Windows hasn't installed the FTDI VCP driver — Windows Update usually handles this within a minute or two of the first plug-in.
Once the OS sees the adapter, you need a terminal program to actually talk to your target. Pick one — they're all fine.
Terminal — pick one tool
# screen ships with macOS — quick and dirty:
screen /dev/cu.usbserial-XXXX 115200
# Exit: Ctrl-A then K then Y
# picocom is nicer (install once with Homebrew):
brew install picocom
picocom -b 115200 /dev/cu.usbserial-XXXX
# Exit: Ctrl-A then Ctrl-X
# CoolTerm is a free GUI option if you'd rather not live in a terminal.
Replace cu.usbserial-XXXX with the exact name from Step 1. Tab-completion (cu.usb<Tab>) usually fills it in for you.
Terminal — pick one tool
# screen is on every distro:
screen /dev/ttyUSB0 115200
# Exit: Ctrl-A then K then Y
# picocom — install once:
sudo apt install picocom # Debian / Ubuntu
sudo dnf install picocom # Fedora
sudo pacman -S picocom # Arch
picocom -b 115200 /dev/ttyUSB0
# Exit: Ctrl-A then Ctrl-X
# minicom — heavier but very capable:
sudo minicom -s # configure once, save as 'dfl'
minicom
Getting Permission denied? You skipped the dialout group step in Step 1.
PuTTY (recommended) or PowerShell
# Easiest: download PuTTY from putty.org and connect interactively.
# Connection type: Serial — Serial line: COM3 — Speed: 115200.
# CLI launch (after PuTTY is on PATH):
putty.exe -serial COM3 -sercfg 115200,8,n,1,N
# Native PowerShell — read-only, but useful for sanity checks:
$port = New-Object System.IO.Ports.SerialPort 'COM3', 115200, 'None', 8, 'One'
$port.Open()
while ($port.IsOpen) { Write-Host $port.ReadLine() }
Replace COM3 with the port from Step 1. Windows Terminal + PuTTY together is the most pleasant combination we've found.
The classic embedded smoke test. esptool.py is Python-based, so the workflow is the same on every OS — only the install path changes. Wire DTR to EN and RTS to IO0 on your ESP32 and esptool will handle the boot-mode dance for you.
esptool via pip
# macOS already ships Python 3 in /usr/bin/python3.
# Install esptool into your user site-packages:
python3 -m pip install --user esptool
# Wire up: GND-GND, TX-RX, RX-TX, plus DTR-EN and RTS-IO0 for auto-reset.
# Erase the chip first to start clean:
esptool.py --port /dev/cu.usbserial-XXXX erase_flash
# Flash an application binary at the standard 0x10000 offset:
esptool.py --chip esp32 \
--port /dev/cu.usbserial-XXXX \
--baud 460800 \
write_flash 0x10000 firmware.bin
If esptool.py isn't found, add Python's user-bin to your $PATH — the installer prints the directory at the end of pip install.
esptool via pip
# Install pip + esptool:
sudo apt install python3-pip # Debian / Ubuntu
sudo dnf install python3-pip # Fedora
python3 -m pip install --user esptool
# Erase, then flash:
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 \
--port /dev/ttyUSB0 \
--baud 460800 \
write_flash 0x10000 firmware.bin
On Ubuntu 24.04+ you may hit a PEP 668 error from system pip. Use a virtual environment instead: python3 -m venv .venv && source .venv/bin/activate && pip install esptool.
PowerShell — Python from python.org
# Install Python from python.org. Tick 'Add Python to PATH' during install.
# Then in a fresh PowerShell window:
python -m pip install --user esptool
# Erase the chip:
esptool.py --port COM3 erase_flash
# Flash:
esptool.py --chip esp32 `
--port COM3 `
--baud 460800 `
write_flash 0x10000 firmware.bin
The backtick (`) is PowerShell's line continuation — it's the equivalent of \ on Unix shells. Replace COM3 with your actual port.
| Function | Notes | |
|---|---|---|
| TX | Transmit (adapter → target) | Outputs at the selected voltage |
| RX | Receive (target → adapter) | 5V-tolerant regardless of switch position |
| GND | Ground | Shared reference with your target |
| DTR | Data Terminal Ready | Commonly repurposed as reset when flashing ESP32 / RP2040 |
| RTS | Request to Send | Flow control output, or boot-mode select on some MCUs |
| CTS | Clear to Send | Flow control input from the target |
| DSR | Data Set Ready | Legacy modem signal — rarely used in embedded work |
| DCD | Data Carrier Detect | Legacy modem signal — rarely used |
| RI | Ring Indicator | Legacy modem signal — rarely used |
The DG-UART uses the stock FTDI VCP drivers — the same signed, maintained driver package that's been around for over a decade. No custom installer, no DG-branded software, nothing to sign up for.
Windows 10 / 11: drivers install automatically over Windows Update within a minute of plugging the adapter in. If they don't, grab the latest VCP installer from FTDI directly and run it manually. A reboot is occasionally needed.
macOS 10.15+: native support is built in. The adapter appears as /dev/cu.usbserial-XXXX as soon as you plug it in. No driver install required.
Linux: the ftdi_sio kernel module is included in every mainstream distribution. The adapter appears as /dev/ttyUSB0 (or similar) immediately. If your user isn't in the dialout group, add them before you try to open the port.
Check the USB-C cable. If it's a charge-only cable, the host can't see data. Swap for the cable in the box — or any USB-C data cable you trust.
Almost always a baud-rate mismatch or the wrong voltage. Confirm your target's baud, and that the switch matches the target's logic level.
Check TX/RX aren't swapped — the adapter's TX goes to the target's RX, and vice versa. Also confirm you share a common GND.
You've picked up an unofficial driver somewhere. Uninstall it, then let Windows Update install the signed FTDI VCP driver — or grab the installer directly from ftdichip.com.
The TX/RX LEDs only blink when traffic is active. Send a character from your terminal. If the TX LED stays dark, confirm the port and baud settings.
The DG-UART does not supply power to the target. Your board needs its own supply. Trying to parasitically power a target from the adapter will not work and may damage both devices.
hello@differentgravy.uk — no ticket system, no bot, no autoresponder. A real engineer, usually within 48 hours.
If you think you've found a bug, tell us what OS you're on and which variant you have. A screenshot of your terminal helps.