
macOS Serial Port Names Explained: `/dev/cu.*` vs `/dev/tty.*` (and which one to use)
Quick answer
- For almost every serial console task on macOS (routers, switches, firewalls, UART debug, microcontrollers), use:
/dev/cu.* /dev/tty.*is used less often, for “incoming line” semantics and specific cases where the open behavior matters.
If you have no internet or you’re on a clean Mac with no extra tools installed, using cu + /dev/cu.* is one of the most reliable offline options. And if you want a better workflow for multiple devices, organized session history and logs, and browser access, that’s exactly where CliDeck fits: CliDeck Workspace.
Why macOS shows two device names for one serial port
When you connect a USB-to-Serial adapter, macOS often creates two device nodes that look almost identical:
/dev/cu.usbserial-XXXX/dev/tty.usbserial-XXXX
This does not mean you have “two different ports.” It’s the same underlying serial line exposed via two access styles:
cuis the “callout” device (think: “outgoing connection,” open the port now)ttyis the “dial-in / call-in” device (think: “incoming line,” where open behavior may differ)
In real-world terms, the rule is simple: if you’re initiating an interactive console session yourself, use /dev/cu.*.
Which one should you use: /dev/cu.* or /dev/tty.*
Use /dev/cu.* almost always
/dev/cu.* is the best default for:
- console access to network gear (Cisco/Juniper/Arista, etc.)
- USB-Serial adapters (FTDI/CP210x/CH340 and similar)
- UART debug on boards and embedded devices
- any scenario where you want to connect, see output, and type commands
Practical reason: /dev/cu.* typically opens immediately and predictably, without “waiting” behavior.
Use /dev/tty.* only if you know you need it
/dev/tty.* makes sense in rarer scenarios where you need “incoming line” behavior (for example, when a service or a specific workflow treats the port as an inbound terminal line).
If you’re unsure, it’s probably not your case.
Comparison table
| Topic | /dev/cu.* | /dev/tty.* |
|---|---|---|
| Typical purpose | “Connect now” | “Incoming line / special open behavior” |
| Best for serial console sessions | Yes (default) | Usually no |
| Chance of confusing behavior in day-to-day use | Lower | Higher |
| Recommendation | Use in almost all cases | Use only when required |
How to find the “right” port on macOS
1) List all callout ports (usually what you want)
ls -1 /dev/cu.*
2) List all dial-in ports
ls -1 /dev/tty.*
3) The most reliable method: diff before/after
ls -1 /dev/cu.* > /tmp/cu_before.txt
# plug in the adapter
ls -1 /dev/cu.* > /tmp/cu_after.txt
diff /tmp/cu_before.txt /tmp/cu_after.txt
The line that appears is your port.
Common port name examples (what you might see)
In practice you’ll often see:
/dev/cu.usbserial-*/dev/cu.SLAB_USBtoUART/dev/cu.wchusbserial*/dev/cu.usbmodem*
The rule doesn’t change: use the /dev/cu.* version, not the matching /dev/tty.*.
How to use the selected port (two common approaches)
Option A: cu (built-in)
Example for 9600 baud (a very common default for network console ports):
cu -l /dev/cu.usbserial-XXXX -s 9600
Exit cu safely:
- press Enter (so
~is the first character on the line), - then type
~.
Option B: screen
screen /dev/cu.usbserial-XXXX 9600
If you use screen, the same device rule applies: /dev/cu.*.
Why it can feel like the port is “stuck” (and the fast fix)
If you chose /dev/tty.* and the session feels odd (slow to open, no output, “hung” behavior), switch to the matching /dev/cu.*.
Quick checklist:
- Make sure the port exists:
ls -1 /dev/cu.*
- Make sure nothing else is using it:
- close IDE serial monitors and any other terminal sessions that might hold the port
- Try the two most common baud rates:
cu -l /dev/cu.usbserial-XXXX -s 9600
cu -l /dev/cu.usbserial-XXXX -s 115200
- If you see garbled characters, it’s almost always a baud rate mismatch.
Where CliDeck helps (and why it complements cu)
cu is a great choice when you need to connect quickly, locally, and offline to a single device. But as soon as your workflow grows beyond “connect and exit,” you usually miss three things:
- multiple devices and sessions in one place (without juggling dozens of terminal windows)
- history and logs (so output isn’t lost and can be reviewed later)
- browser access and a team-friendly workflow
That’s exactly why we build CliDeck: CliDeck Features.
Mini FAQ
Why do I have both /dev/cu.* and /dev/tty.*?
Because macOS exposes two access styles to the same serial line: “callout” and “dial-in.” For everyday console work, you almost always want callout.
Which one should I use for routers/switches/Arduino?
/dev/cu.*.
Can I break anything by opening /dev/tty.*?
Usually not. But you can waste time troubleshooting confusing behavior. Using /dev/cu.* avoids that in most cases.
Bottom line
If you’re initiating a serial console session from a Mac, use /dev/cu.*. It’s the most practical and predictable option.
And when you need more than “connect and exit” (multiple devices, session history, logs, browser access), try CliDeck: CliDeck Workspace.