2026-06-03

USB CDC ACM DTR and RTS Debugging: SetControlLineState, Serial Port Opens, Bootloader Reset, and Missing Data

How to debug USB CDC ACM DTR and RTS control line state, SetControlLineState requests, serial port open behavior, bootloader reset triggers, and missing serial data.

usb cdc acm, dtr, rts, set control line state, serial port, bootloader reset, usb diagnostics

USB CDC ACM devices look like serial ports, but many "serial port" bugs are really USB class-control bugs. Users search for "CDC ACM DTR RTS", "SetControlLineState USB", "USB serial no data until DTR", "Arduino resets when serial port opens", "USB CDC bootloader reset", and "COM port opens but device does not respond" when the port exists but behavior is wrong.

BusScope is useful because DTR and RTS are not magic application flags. The host sends class-specific control requests, and firmware reacts to those requests.

What SetControlLineState does

CDC ACM uses a class request commonly called SetControlLineState. It communicates control line state such as:

  • DTR: Data Terminal Ready.
  • RTS: Request To Send.

Many devices use these bits for more than traditional modem behavior. Firmware may start streaming only after DTR is asserted, enter bootloader when DTR toggles, or use RTS for flow-control semantics.

Common symptoms

Control line issues show up as:

  • COM port opens but no data arrives.
  • Device starts sending only after terminal program connects.
  • Firmware resets when a serial monitor opens.
  • Bootloader appears after port open/close.
  • Data stops when DTR drops.
  • RTS/CTS flow control option changes behavior.
  • Linux tool works but Windows tool does not.
  • Python script behaves differently from terminal emulator.

These are strong SEO phrases because engineers often search from the application symptom.

Serial port open behavior

Different host applications set DTR and RTS differently when opening a port.

Examples:

  • Terminal emulator asserts DTR immediately.
  • Script opens port but leaves DTR false.
  • Firmware update tool toggles DTR as reset signal.
  • Driver sets RTS based on flow-control settings.
  • Application closes port and drops DTR unexpectedly.

The packet trace can show the actual control request sequence instead of relying on application assumptions.

Bootloader reset patterns

Many development boards use DTR or RTS transitions to reset into bootloader mode. This is convenient for firmware upload, but surprising in production tools.

Failure patterns:

  • Device resets every time a log viewer opens.
  • Firmware upload works but normal serial connection fails.
  • Device appears as one USB identity, resets, then re-enumerates as bootloader.
  • Serial number or product string changes after reset.
  • Application loses the port handle.

BusScope should preserve the control request and re-enumeration sequence.

No data until DTR

Some firmware intentionally waits for DTR before sending data. This can make one tool appear broken while another works.

Evidence:

  • Host opens bulk or interrupt endpoints.
  • No IN data is sent.
  • Host sends SetControlLineState with DTR true.
  • Device begins transmitting.

This is not a cable problem and not necessarily a driver bug. It is firmware policy.

RTS and flow control confusion

RTS may be used for hardware flow control, but many USB CDC devices do not have real modem lines. Firmware may still expose RTS state to application logic.

Questions:

  • Does host set RTS?
  • Does device require RTS before sending?
  • Does enabling hardware flow control in terminal change request bits?
  • Does firmware ignore RTS but documentation claims otherwise?
  • Is RTS used as bootloader or mode-select signal?

Packet evidence prevents guessing.

Debug checklist

Use this process:

  1. Capture enumeration.
  2. Open the serial port with the failing app.
  3. Record CDC class-specific requests.
  4. Find SetControlLineState.
  5. Decode DTR and RTS bits.
  6. Compare with a working terminal program.
  7. Check whether data starts after DTR.
  8. Check whether reset or re-enumeration follows a toggle.
  9. Compare Windows and Linux tools.
  10. Preserve control requests and first data packets together.

Final diagnosis

USB CDC ACM DTR and RTS problems are class-control sequencing problems. The port may exist and drivers may bind correctly while firmware waits for a control line state the application never sends.

BusScope helps show SetControlLineState, DTR, RTS, serial open behavior, bootloader resets, and missing-data causes at the USB protocol level.