2026-06-02

USB CDC ACM Serial Debugging: Line Coding, Control Line State, and Missing Data

How to debug USB CDC ACM virtual serial devices by inspecting SET_LINE_CODING, SET_CONTROL_LINE_STATE, bulk endpoints, and firmware behavior.

USB, CDC ACM, serial, line coding, firmware

USB CDC ACM devices are used for virtual serial ports, device consoles, firmware tools, telemetry, test fixtures, and embedded diagnostics. They look simple from the application side: open a COM port or /dev/ttyACM*, set a baud rate, read and write bytes. Underneath, the host and device still exchange class-specific USB requests and bulk transfers.

When a CDC device enumerates but no data moves, the capture can show whether the problem is descriptor layout, line coding, control line state, endpoint traffic, or firmware buffering.

CDC ACM Has Control and Data Interfaces

A typical CDC ACM device exposes a communication interface and a data interface. The host may send class-specific requests before data transfer begins.

Important evidence:

  • communication interface descriptor
  • data interface descriptor
  • CDC functional descriptors
  • notification endpoint
  • bulk IN endpoint
  • bulk OUT endpoint
  • SET_LINE_CODING
  • GET_LINE_CODING
  • SET_CONTROL_LINE_STATE

If these requests never arrive, the host may not have bound the expected CDC driver.

Baud Rate Is Often a Signal, Not a Physical UART

For many USB CDC devices, the baud rate is not physically meaningful in the same way it is for a UART. But the host still sends line coding. Firmware may use it to configure a bridge, ignore it, or validate it.

Capture questions:

  • did host send SET_LINE_CODING?
  • what baud rate, parity, stop bits, and data bits were requested?
  • did firmware accept the request?
  • did the host set DTR or RTS with SET_CONTROL_LINE_STATE?
  • does firmware wait for DTR before sending?

Many "no serial output" problems are actually "firmware waits for DTR and the host never asserted it" or "application opened the port but did not configure it as expected."

Bulk Endpoints Prove Data Movement

After setup, CDC data usually moves over bulk endpoints. If writes from host appear on bulk OUT but no bulk IN response follows, firmware may not be sending. If bulk IN data appears but the application does not display it, the issue may be host application behavior.

Inspect:

  • endpoint direction
  • transfer lengths
  • repeated NAK/timeout behavior
  • actual payload bytes
  • status of transfers
  • ordering relative to line-state requests

This is how a USB capture becomes more useful than a terminal screenshot.

Where BusScope Fits

BusScope should help firmware teams keep descriptors, class requests, and raw endpoint data in one session. For CDC ACM debugging, it should answer:

  • did the host bind CDC?
  • what line coding did it send?
  • did DTR/RTS change?
  • did bulk OUT carry commands?
  • did bulk IN carry responses?
  • did the issue happen before or after serial-style traffic began?

For searches like "USB CDC ACM no data," "virtual COM port no output," or "SET_CONTROL_LINE_STATE DTR," the evidence is not in the terminal alone. It is in the USB class requests and endpoint transfers.