Serial Terminal Documentation

Installation

MacTools Serial Terminal is a native macOS app built with Rust and Tauri. It runs natively on Apple Silicon and Intel Macs — no Rosetta, no Parallels, no Java, no Node.js. One-time purchase, no subscription.

Download

System Requirements

RequirementMinimum
macOS12 Monterey or newer (Apple Silicon & Intel)
Serial adapterUSB-to-Serial: FTDI FT232, CH340/CH341, SiLabs CP2102, or Prolific PL2303 (RS232, RS485, or RS422 variants)
Native CDC-ACMArduinos, Particle, ESP32 (USB CDC class) appear without a driver

First Launch

If you downloaded the direct build outside the App Store, macOS Gatekeeper may block the unsigned binary on first run. Right-click the app, choose Open, then confirm. This is only required once.

No kernel drivers required. macOS includes CDC-ACM and FTDI drivers, and the app ships user-space drivers for CH340, CP2102, and Prolific adapters. Plug in your adapter and it appears as /dev/cu.usbserial-* or /dev/cu.usbmodem*.

Quick Start

1. Talk to an RS-232 device (AT command console)

The fastest path — a cellular modem, GPS module, or any device with an AT-style command line.

  1. Plug in your USB-to-Serial adapter.
  2. Open the app and pick the port from the dropdown (/dev/cu.usbserial-*). Prefer the cu.* name — it does not require the DCD carrier line.
  3. Set framing to 115200 8N1 (most common modern default) and click Open.
  4. Type AT and press Enter. The device should reply OK.

2. Capture hex traffic from an RS-485 device

  1. Set mode to Hex (Tx + Rx) in the toolbar.
  2. Tap into the RS-485 A/B lines (or use a Y-adapter on the bus). On a 2-wire bus, the app listens to its own transmitted frames — that is expected.
  3. Watch frames roll in. Bytes are shown as 01 03 00 0A 00 02 … with timestamps. Toggle Show ASCII to overlay printable characters side-by-side.
  4. Click Export to save the capture as a text log for post-mortem analysis.

3. Send a raw hex sequence

  1. Switch the Tx mode to Hex.
  2. Type the frame as space-separated bytes: 01 04 00 00 00 0A 70 0D (a Modbus RTU read of 10 input registers).
  3. Hit Send. The app validates even byte count and computes the CRC automatically if Append CRC is enabled.

4. Debug an Arduino firmware over USB CDC

Plug in the Arduino and select /dev/cu.usbmodem*. Set the baud to match Serial.begin(). println() output appears in real time; lines ending in \r\n render correctly. For binary sketches, switch to hex mode to see raw payload bytes.

Configuration

Serial Framing

Framing must match the device exactly. A single wrong bit (e.g. 8N1 vs 8E1) turns every byte into garbage.

ParameterCommon Values
Baud rate9600, 19200, 38400, 57600, 115200, 921600
Data bits7, 8 (8 is the modern default)
ParityNone, Even, Odd, Mark, Space
Stop bits1 or 2
Flow controlNone, RTS/CTS hardware, XON/XOFF software
Industrial defaults9600 8N1 (Schneider, ABB), 9600 8E1 (Siemens, many VFDs)
GPS / NMEA4800 8N1 (legacy) or 38400 8N1 (modern receivers)

Display Modes

ModeUse Case
ASCIIText protocols — AT commands, NMEA sentences, debug prints
HexBinary protocols — Modbus RTU, proprietary frames, raw firmware uploads
ASCII + HexSide-by-side; printable bytes render as characters, non-printable as ·
DecimalReviewing integer payloads without byte-order confusion

Line Endings

Serial devices are picky about line endings. Mismatched terminators are the second most common "the device doesn't respond" cause after baud rate.

SequenceWhere it's used
\r\n (CR+LF)AT commands, most modems, NMEA, HTTP-over-serial
\n (LF)Unix-style firmware debug prints, Arduino println
\r (CR)Legacy terminals, some PLC programming ports
NoneBinary protocols, raw hex frames

Timings & inter-byte gaps

For RS-485 with multiple slaves, set a post-Tx idle (≥3.5 character times) before releasing the bus. On 9600 8N1 that is roughly 4 ms; on 115200 it shrinks below 0.5 ms. The app can enforce this automatically when RTS/RS485 direction control is enabled.

Key Features

Simultaneous hex and ASCII view

Every byte is shown in both representations on a single line with a millisecond timestamp, direction (Tx / Rx), and a printable-character preview. No more switching tabs to figure out which ASCII character corresponds to a hex byte.

Macros & scripted Tx

Save frequently-sent frames as named macros — a Modbus discovery poll, a calibration command, a sensor read. Bind each macro to a function-key shortcut and trigger them during commissioning without retyping. Macros can chain with a configurable delay for automated test sequences.

Automatic CRC / checksum

For Modbus RTU (CRC-16), checksum-8, XOR, and Fletcher, the app appends the correct bytes before transmission and validates them on receive. Frames with bad CRC are highlighted red in the log so a noisy bus jumps out instantly.

Traffic capture & export

Continuous capture with circular buffering (holds hours of traffic in RAM). Export the current session as plain text, CSV (timestamp, dir, bytes), or a binary .bin blob. Useful for sharing a comms issue with a vendor or replaying through a decoder later.

RS-485 bus tap mode

Listen-only mode disables the transmitter entirely so the app can snoop a live RS-485 bus between two other devices without disrupting traffic. Combined with hex view it is the fastest way to reverse-engineer an unknown serial protocol.

Native driver stack

User-space drivers for FTDI, CH340, CP2102, and Prolific are bundled. No kernel extensions, no unsigned-driver warnings on Apple Silicon. Counterfeit Prolific chips (the historical pain point) are detected and routed through the open-source fallback driver.

Troubleshooting

No port appears in the dropdown

Symptom: The dropdown shows no /dev/cu.usbserial-* entries.
Fix: Open Apple menu → About This Mac → More Info → System Report → USB and check the adapter enumerates. If it shows but no device node appears, the chip driver failed — unplug/replug, try another USB port or cable (a charge-only cable is the most common cause on adapters with a USB-C breakout). Counterfeit PL2303 chips fail more often than genuine FTDI/CP2102 parts.

Port busy / Permission denied on open

Symptom: "Permission denied" or "Resource busy" when opening /dev/cu.*.
Fix: Another process holds the port — close screen, minicom, Arduino IDE's Serial Monitor, or a second instance of the app. On macOS 13+ the first time the app opens a serial port you may need to grant permission under System Settings → Privacy & Security → Files and Folders.

Garbage characters in the Rx window

Symptom: ASCII mode shows mojibake; hex shows plausible but wrong bytes.
Fix: Baud/parity/stop-bits mismatch. 9 out of 10 times the baud is wrong — try 9600, 19200, 115200 first. If the first byte of every frame is fine but later bytes corrupt, drop the baud (long cable / cheap adapter can't sustain it) and add a 120 Ω termination resistor on RS-485.

RS-485: device never responds

Symptom: Tx frames go out, no Rx comes back.
Fix: Swap A and B (D+ / D−). Polarity is mislabeled on roughly half of all RS-485 adapters and is by far the most common RS-485 wiring fault. If polarity is correct, check the bus has exactly one bias resistor pair and one termination at each physical end — over-termination loads the bus and starves signal level.

CRC errors on every received frame

Symptom: Hex view highlights every frame red with "bad CRC".
Fix: Either the framing is wrong (see "garbage characters" above), or you are running CRC validation on a non-Modbus payload. Disable Validate CRC if the device is not speaking Modbus. If the device is speaking Modbus and CRC is failing, the issue is electrical (grounding, termination, baud too high for cable length).

Carriage returns appear as \r\n instead of a new line

Symptom: Text output runs together or shows literal control characters.
Fix: Under Display → Line endings, toggle "Render \r\n as newline" on for text protocols. For binary protocols, keep it off so control bytes are visible.

Support

When reporting a comms issue, attach the exported capture log (redact any sensitive payloads) and note the adapter chip (FTDI / CH340 / CP2102 / PL2303) plus the exact baud/parity/stop-bits in use.