Once you have more than a couple of boards under test, you quickly run out of UART ports on the management node.
A multi-channel USB UART hub is the easy way out. A CH9344-based board exposes 4 serial ports over a single USB connection, and a CH348-based board does 8. One USB cable, several DUTs.
What Breaks First
Port assignments are not stable by default. When the hub re-enumerates, what used to be your port 0 can come back as a different tty. If CI expects DUT 0 on a specific device node, you have a flaky lab failure waiting to happen.
udev rules solve this by assigning persistent names based on hardware ID and topology. Once names are stable, retry logic can handle reconnects without scrambling which DUT is which.
OpenOCD Interaction
If you run OpenOCD on the same management node, the UART hub can briefly disconnect during flashing. Stable names and a bit of retry logic on the test side keep this manageable even when you cannot fully prevent the USB churn.
It's worth treating console access as infrastructure rather than a cable on the bench. Once it has a stable name and lives in your HIL setup as a named resource, the rest of the lab gets easier to build on top of it.