Just in case you're as curious as I was: yes, you can absolutely build a USB to DMX converter that uses a single UART both for receiving ASCII DMX frames via USB (e.g. using an FT232 or CH340G chip) and for sending out DMX frames to a MAX485 or similar. Just not at the same time, but that's what we've got TDMA (time division multiple access) for.
Or, to use a concrete example: yes, an Arduino Nano (ATMega328P with USB-to-serial on-board) can be turned into a USB-to-DMX converter by adding an RS485 adapter and writing a bit of firmware.
The idea is quite simple:
- Every 250 or so milliseconds, disable the UART receive interrupt, configure the UART for DMX output (250 kbaud, 8 data bits, 2 stop bits, no parity), and transmit a DMX frame
- Once done, configure the UART for serial input (e.g., 57600 baud, 8 data bits, 1 stop bit, no parity) and enable the receive interrupt
- Once a complete DMX frame has been received on the USB side, update the DMX output frame accordingly
- Rinse and repeat, making sure not to output any serial data via UART – it's scrictly DMX only
The single drawback is that, while DMX output is running, UART input will be lost – there's no receive interrupt, and even if there was, it would be gibberish due to incompatible UART configuration. However, 57600 baud is not that fast compared to 250 kbaud, so if the PC just transmits its desired DMX frame a few times in quick succession, one of them is bound to be received.
I implemented this in multipass as uart-to-dmx-mega328 and so far it's working reliably. Of course, it's not suitable for anything where you need sub-second scale timing accuracy. But if all you need are some static or slowly fading background hues, it works just fine. In my case, the Neutrik XLR plug used to transmit the DMX signals to a light fixture is probably by far the most expensive item in the entire setup, save for the light fixture itself.