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
- Direct purchase: buy direct ($9.99 one-time) — you receive a download link by email
- Product page: /serial-terminal/
System Requirements
| Requirement | Minimum |
|---|---|
| macOS | 12 Monterey or newer (Apple Silicon & Intel) |
| Serial adapter | USB-to-Serial: FTDI FT232, CH340/CH341, SiLabs CP2102, or Prolific PL2303 (RS232, RS485, or RS422 variants) |
| Native CDC-ACM | Arduinos, 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.
/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.
- Plug in your USB-to-Serial adapter.
- Open the app and pick the port from the dropdown (
/dev/cu.usbserial-*). Prefer thecu.*name — it does not require the DCD carrier line. - Set framing to
115200 8N1(most common modern default) and click Open. - Type
ATand press Enter. The device should replyOK.
2. Capture hex traffic from an RS-485 device
- Set mode to Hex (Tx + Rx) in the toolbar.
- 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.
- 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. - Click Export to save the capture as a text log for post-mortem analysis.
3. Send a raw hex sequence
- Switch the Tx mode to Hex.
- Type the frame as space-separated bytes:
01 04 00 00 00 0A 70 0D(a Modbus RTU read of 10 input registers). - 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.
| Parameter | Common Values |
|---|---|
| Baud rate | 9600, 19200, 38400, 57600, 115200, 921600 |
| Data bits | 7, 8 (8 is the modern default) |
| Parity | None, Even, Odd, Mark, Space |
| Stop bits | 1 or 2 |
| Flow control | None, RTS/CTS hardware, XON/XOFF software |
| Industrial defaults | 9600 8N1 (Schneider, ABB), 9600 8E1 (Siemens, many VFDs) |
| GPS / NMEA | 4800 8N1 (legacy) or 38400 8N1 (modern receivers) |
Display Modes
| Mode | Use Case |
|---|---|
| ASCII | Text protocols — AT commands, NMEA sentences, debug prints |
| Hex | Binary protocols — Modbus RTU, proprietary frames, raw firmware uploads |
| ASCII + Hex | Side-by-side; printable bytes render as characters, non-printable as · |
| Decimal | Reviewing 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.
| Sequence | Where 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 |
| None | Binary 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
- Email: support@voltrus.id
- Product page: /serial-terminal/
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.