Skip to content

Online Serial Terminal (Web Serial Monitor)

Serial monitor in Chrome or Edge, no install: connect CH340, CP2102, ESP32 or Arduino, send text or HEX, repeat on a timer, append Modbus CRC-16 automatically. Garbled text? It spots GBK and redraws what was already received.

Runs in Browser Free
Your browser reads and writes the port directly — serial data is never sent to our servers.
Not connected

Connect a device and the data it sends appears here.

ms
Quick send
The send and receive paths are tested byte for byte against a simulated serial port in the browser: GBK and UTF-8 characters split across reads, CRC-16/MODBUS (01 03 00 00 00 0A → C5 CD, 01 06 00 01 00 03 → 98 0B), XOR, 8-bit sum and idle-gap framing are covered by unit and end-to-end tests, with CRC values taken from an independent implementation. — Go Tools Team · Oct 11, 2026

Built and verified by the Go Tools engineering team.

Serial terminal quick answers

Which browsers can open a serial port?

Desktop Chrome, Edge and Opera These Chromium-based browsers (Chrome 89 and later) ship the Web Serial API: open the page and click Select port & connect. Desktop Firefox 151 and later also works once you install the site permission add-on it offers; Safari and iOS do not support it. The demo device shows every feature in any browser.

Why does Chinese text printed by printf show up garbled?

A common cause: the device sends GBK Chinese microcontroller projects in Keil or IAR are often saved as GBK, so printf sends GBK bytes. The tool notices when the data reads correctly as GBK, offers to switch, and redraws what was already received. If letters and digits are garbled too, check the baud rate first.

What does Failed to open serial port mean?

The browser does not say why Every failure produces the same message, Failed to open serial port. Work through the usual causes: close other serial tools, the Arduino IDE serial monitor and debuggers; on Linux add your user to the dialout group (uucp on Arch); make sure the device is still plugged in; try a standard baud rate.

Which CRC byte does Modbus send first?

The low byte CRC-16/MODBUS of 01 03 00 00 00 0A is 0xCDC5, sent on the wire as C5 CD. Choose Append checksum → CRC-16/MODBUS and the tool adds it in that order and shows it in the preview.

AT commands get no reply?

End the line with \r\n ESP8266 and ESP32 AT firmware ends a command at carriage return + line feed (\r\n), so a bare AT just waits. Set the line ending to \r\n (CRLF) and send again.

What is an online serial terminal?

A serial terminal opens a serial port on your computer — a COM port, usually created by a USB-to-serial chip such as a CH340 or CP2102 — and exchanges bytes with a device at its baud rate: reading the log a microcontroller prints, sending AT commands to a module, talking to a Modbus device. The traditional tools are desktop programs. This one uses the Web Serial API built into the browser, so it needs no install and works in Chrome and Edge on Windows, macOS and Linux.

Your browser reads and writes the port directly; the tool never sends serial data to our servers. The page cannot scan for ports on its own either: it can open only a port you pick and authorise in the browser's dialog.

Two things set this tool apart from most serial terminals. It keeps the raw bytes it receives, so switching between UTF-8 and GBK, or between Text and HEX view, redraws the whole screen with the new setting — garbled output does not mean starting over. And it previews every byte it is about to write, with the checksum and line ending marked separately; a typo in HEX input is reported with the offending character instead of being silently dropped from the frame.

# Text view, line ending \r\n
[09:30:01.204] → AT␍␊
[09:30:01.219] OK
# HEX view, CRC-16/MODBUS appended (low byte first)
[09:30:02.517] → 01 03 00 00 00 0A C5 CD
[09:30:02.539] 01 03 14 00 64 00 65 00 66 00 67 00 68 00 69 00 6A 00 6B 00 6C 00 6D 63 D1

Features of the web serial terminal

No install — Windows, Mac and Linux

Built on the browser's Web Serial API: desktop Chrome, Edge and Opera connect to CH340, CP2102, FT232 and PL2303 adapters as well as the native USB serial of boards like the ESP32-S3 and Arduino. Handy on locked-down work machines, or on a Mac without a serial tool you like.

Garbled text diagnosis

When incoming bytes decode to garbage, the tool re-reads the most recent data in another encoding and, if it makes sense, offers Switch to GBK. Switching re-decodes everything already received, not just new data. ASCII / Latin-1 byte-per-character view is also available.

Text and HEX, with a byte preview

Type HEX as 01 03 00, 0x01,0x03 or 010300; invalid characters and odd digit counts are reported, not skipped. The bytes about to be written appear under the input, with checksum and line ending in brackets. Text mode offers \r\n, \n or \r line endings and optional \r \n \xHH escapes.

CRC, XOR and sum checksums appended for you

Append CRC-16/MODBUS (low byte first), XOR (BCC) or an 8-bit sum to every frame — no separate calculator needed for Modbus RTU. For other CRC variants, look up the parameters with a CRC calculator first and append the bytes by hand.

Frames split on idle gaps, millisecond timestamps

In HEX view a new frame starts whenever the line has been quiet longer than the set number of milliseconds (50 ms by default), so request/response protocols show one frame per line. Every line carries a millisecond timestamp and byte counters update live.

Timed send, history and log export

Repeat a command at a fixed interval for polling or soak tests, resend recent commands with one click, and export the log as text with timestamps, direction and raw HEX — so it can be re-decoded or parsed by another tool later.

Serial examples: AT commands, Modbus, garbled text

Testing an AT module (ESP8266 / ESP32 AT firmware)

Send (text, line ending \r\n): AT
Bytes written: 41 54 0D 0A
Reply: OK

ESP-AT firmware ends a command at carriage return + line feed; with only 41 54 written the module keeps waiting. With the \r\n line ending the preview shows 41 54 [0D 0A].

Reading Modbus RTU holding registers (CRC added automatically)

Send (HEX, append CRC-16/MODBUS): 01 03 00 00 00 0A
Bytes written: 01 03 00 00 00 0A C5 CD
Slave reply: 01 03 14 00 64 00 65 … 00 6D 63 D1

Slave 01, function 03, start address 0000, quantity 000A. The CRC is 0xCDC5 and Modbus sends the low byte first, so C5 CD goes on the wire. In the reply, 14 is the byte count (20 bytes = 10 registers) and the last two bytes are again a low-byte-first CRC. The demo device answers in exactly this format.

Chinese text printed by a microcontroller shows as garbage

Received: CE C2 B6 C8 3A 32 35 A1 E6 0D 0A
As UTF-8: �¶�:25��
As GBK: 温度:25℃

The same bytes are garbage as UTF-8 and read 温度:25℃ (temperature: 25 °C) as GBK. Nothing is corrupted — the two ends simply disagree on the encoding. The tool detects this and offers to switch.

Custom protocol frame with an XOR checksum

Send (HEX, append XOR / BCC): AA 55 01 02
Bytes written: AA 55 01 02 FC

XOR folds every payload byte together: AA ⊕ 55 ⊕ 01 ⊕ 02 = FC. The checksum covers every byte in the input box; if your protocol leaves the header out of the calculation, compute that checksum separately and type it in.

How to use the online serial terminal

  1. 1

    Connect the device

    Plug the board or USB-to-serial adapter into the computer. On Windows a new COM port should appear under Ports (COM & LPT) in Device Manager; if it does not, the driver is missing or the cable is charge-only.

  2. 2

    Match the port settings

    Baud rate, data bits, parity and stop bits must match the firmware — 115200 8N1 and 9600 8N1 are the usual ones. The settings lock while connected; disconnect to change them.

  3. 3

    Select the port and connect

    Click Select port & connect and pick the port in the browser's list. The status bar names the chip maker by its USB vendor ID, for example WCH (QinHeng) or Silicon Labs CP210x. No hardware? Click Demo device.

  4. 4

    Watch incoming data

    Text view shows one line per line received, each with a millisecond timestamp. For binary protocols switch to HEX view, which splits frames on idle gaps. If text is garbled, follow the encoding hint.

  5. 5

    Send, then save the log

    Choose Text or HEX, a line ending and a checksum, check the byte preview and press Ctrl+Enter. Use timed send for polling. When you are done, click Save log to export everything.

Common serial problems: garbage, no reply, port won't open

Chinese text shows as garbage

The device sends GBK but the terminal decodes UTF-8, so every Chinese character turns into replacement characters or stray symbols. The data is fine; read it with the right encoding.

✗ Wrong
Encoding: UTF-8
Shown: �¶�:25��
✓ Correct
Encoding: GBK
Shown: 温度:25℃

AT command gets no reply

ESP8266 and ESP32 AT firmware starts parsing a command only after \r\n. With the line ending set to None, only the two bytes 41 54 were written.

✗ Wrong
41 54
✓ Correct
41 54 0D 0A

Modbus slave does not answer

An RTU frame needs a correct CRC with the low byte first, and nothing after it. Without the CRC, with its bytes swapped, or with a 0D 0A line ending still switched on in HEX mode, the slave discards the frame as corrupt and sends nothing back.

✗ Wrong
01 03 00 00 00 0A CD C5
✓ Correct
01 03 00 00 00 0A C5 CD

Everything is garbage, even letters and digits

This is rarely an encoding problem. The baud rate — or data bits or parity — does not match the device, so every byte is sampled at the wrong moments; at twice or half the device's rate you typically get far fewer or far more bytes than were sent, most of them nonsense. Use the values the firmware sets.

✗ Wrong
Terminal 57600 8N1, device 115200 8N1
✓ Correct
Terminal 115200 8N1, device 115200 8N1

When a browser serial terminal helps

Arduino and ESP32 debug output
Read what Serial.println() prints — sensor readings, state changes — with millisecond timestamps to follow the order of execution.
STM32 and 8051 printf logs
printf redirected to a USART on Chinese-language projects often prints GBK. Switch the encoding here instead of changing the firmware.
Bringing up Modbus RTU devices
Talk to meters and PLCs through an RS-485-to-USB adapter: send HEX with the CRC appended and see replies split into frames. Registers that hold floating-point values arrive as four raw bytes in IEEE 754 format.
Configuring AT command modules
Send AT commands to Wi-Fi, cellular and Bluetooth modules with the right line ending, and keep frequent commands in the send history for one-click resend.
Quick checks on machines without your tools
On a locked-down work PC, a shared lab machine, a Mac or a Linux box, open the page and go. To read captured HEX as text in other encodings, paste it into Hex to String.

How serial communication and Web Serial work

How the Web Serial API opens a port
The browser opens the port through the operating system's serial driver — a COM port on Windows, /dev/cu.* on macOS, /dev/ttyUSB* or /dev/ttyACM* on Linux — and hands the page two byte streams: a ReadableStream for incoming data and a WritableStream for outgoing data. Access is granted per port and only through the browser's own chooser; a page cannot list the serial ports on your machine by itself.
8N1 and the baud rate
8N1 means 8 data bits, no parity, 1 stop bit. With the start bit, each byte takes 10 bits on the line, so 115200 baud carries at most about 11,520 bytes per second and 9600 baud about 960. A large baud rate difference, or mismatched data bits or parity, turns the data into garbage (Windows also reports framing errors).
Why frames need splitting
A serial line has no notion of packets. The USB-to-serial chip gathers received bytes into USB packets, and each browser read returns one such chunk — a frame can arrive in two chunks, or several frames in one. HEX view re-splits the stream on idle time between chunks. The browser only knows when each chunk reached the page, not when each byte crossed the wire, so the default threshold is 50 ms; adjust it to your protocol. Modbus RTU itself requires at least 3.5 character times of silence between frames — about 4 ms at 9600 baud — which a browser cannot measure that precisely, so idle-gap framing is an approximation, not a Modbus-exact frame detector.
UTF-8 versus GBK bytes
温度 (temperature) is E6 B8 A9 E5 BA A6 in UTF-8, three bytes per character, and CE C2 B6 C8 in GBK, two bytes per character. A character's bytes can be split across two reads, so decoding is streamed and keeps an incomplete tail for the next chunk; changing the encoding re-decodes from the raw bytes.
How the three checksums work
CRC-16/MODBUS: polynomial 0x8005 (0xA001 in reflected form), initial value 0xFFFF, input and output reflected, no final XOR, sent low byte first. XOR (BCC): every byte XORed together into one byte. SUM8: every byte added, keeping only the low 8 bits. All three cover the payload only, never the line ending added after it.

Serial debugging tips

Check the settings before the encoding
When output is garbled, first make sure baud rate, data bits, parity and stop bits match the device. With wrong settings no encoding will read correctly.
Use HEX view for binary protocols
Protocols such as Modbus are full of 00, 0D and 0A bytes that text view treats as line breaks or control characters — the ASCII table lists them all. Switch to HEX view and set the frame gap a little above the device's response gap.
Use one encoding in firmware and terminal
For new projects, save source files as UTF-8 so logs read correctly everywhere. For existing GBK projects, set the encoding here to GBK once; the tool remembers it.
Keep the raw HEX log
When chasing intermittent faults, the exported log keeps every chunk's raw bytes and millisecond timestamp. Saving only decoded text would freeze the encoding choice into the file.
Do not set the timed-send interval too short
The interval must exceed the time the device needs to process a command and reply, or requests pile up and replies stop matching them. Take the response time from the device manual and leave a margin.

Serial terminal FAQ

Do I need to download or install anything?
Not in Chrome or Edge: the page uses the Web Serial API built into the browser — no desktop client, no extension. In Firefox 151 and later you first install the site permission add-on it prompts for; that is the browser's permission mechanism, not a serial driver. Either way you need the driver for the serial chip: if a COM port shows up in Device Manager, the driver is working; if not, get the driver from the chip vendor's website.
Which browsers work? Can I use it on a phone?
Desktop Chrome, Edge and Opera (Chrome 89 and later) connect directly. Desktop Firefox 151 and later also works after you install the site permission add-on it prompts for. Safari and iOS do not support Web Serial. Chrome for Android 138+ exposes only Bluetooth (RFCOMM) serial ports; wired USB serial needs Chrome 148+ on Android 17, and the phone itself must expose wired serial ports. Where the page cannot connect it says so, and the demo device still works.
Is any serial data uploaded to a server?
No. Your browser reads and writes the port directly, and the tool never sends the bytes you send or receive to our servers. Send history and settings are stored in your own browser.
The port list is empty after I click Select port & connect. What now?
The operating system has not detected a serial device. Check that the cable carries data, not just power, and that the board is powered. On Windows a COM port should appear in Device Manager; if it does not, install the driver for the chip (CH340, CP2102 and so on).
Why does the port fail to open?
The browser reports every failure with the same message, Failed to open serial port., so the cause has to be found by elimination. A common cause is another program holding the port: close other serial tools, the Arduino IDE serial monitor, an IDE that is debugging, or another tab of this tool. On Linux your user must be in the dialout group (uucp on Arch). Also check that the device is still plugged in, and try a standard baud rate — some drivers refuse unusual ones.
How do I fix garbled Chinese text?
Look at the English letters and digits first. If they are fine and only Chinese is garbled, it is an encoding mismatch — a common case is a device sending GBK. The tool detects this, offers to switch and redraws what was already received. If letters and digits are garbled too, the baud rate or another setting does not match the device.
How do I send HEX? Which formats are accepted?
Switch the send mode to HEX and type 01 03 00 0A, 0x01,0x03 or 0103000A, in upper or lower case. Invalid characters such as G and odd digit counts are reported, never skipped, and the bytes to be written are previewed under the input.
How do I add a Modbus CRC, and why is the low byte first?
Set Append checksum to CRC-16/MODBUS and type only the address, function code and data; the CRC is added at the end. Modbus RTU sends the CRC low byte first: 0xCDC5 goes out as C5 CD.
Why is one frame split over two lines, or several frames merged into one?
HEX view splits frames on the idle time between arrivals, 50 ms by default. If the device pauses longer than that in the middle of a frame, the frame is split; if frames follow each other more closely, they merge. Set the frame gap above the in-frame pause and below the gap between frames.
What are DTR and RTS, and why did my board reset when I connected?
DTR and RTS are two serial control lines that many boards wire to their reset circuit. When Chrome opens a port it sets both lines active — an implementation detail, not part of the standard — so boards that reset on DTR, such as the Arduino Uno, usually reset once when you connect, and a web page cannot prevent it. On the common ESP32 auto-program circuit the chip runs normally while both lines are active and is held in reset only when RTS is active and DTR is not. Use the toggles after connecting; if an ESP32 goes silent, check that you did not switch off DTR alone.
Can I open the same port in another serial tool at the same time?
On Windows, no: a COM port can be open in only one program at a time. On Linux and macOS it depends on whether the first program asked for exclusive access. If it did, opening the port here fails; if it did not, both programs open it and split the incoming data between them, which looks like lost bytes. Use one program at a time.
Are custom baud rates supported?
Yes. The last entry in the list is Custom, where you can type any rate, such as 74880 — the rate the ESP8266 boot ROM prints at. The browser passes the value through unchanged; whether it works depends on the USB-to-serial chip and its driver. Some round it to the nearest rate they support, and on some systems the port then fails to open.
What is the demo device?
A simulated microcontroller built into the page, so no hardware is needed. On connect it prints a start-up message in GBK — a ready-made demonstration of the encoding hint — and then reports a temperature every 2 seconds. It answers AT with OK and other AT commands with ERROR. It answers a Modbus function 03 read addressed to slave 1 with a correct CRC; like a real slave it stays silent when the CRC is wrong or the frame is for another address. Anything else is echoed back.

Related Tools

View all tools →