One transistor to help them all
Bidirectional Serial Communication — and a Surprise
After getting the firmware loaded and the device working, I wanted to take things a step further. The CL9 Core has a serial interface — the CS-232 port — which is documented quite well and allows not just uploading firmware, but also transferring remote control code definitions back and forth between the device and a computer. That's a killer feature for anyone who wants to back up your custom-programmed codes or share them with others.
So I continued experimenting with bidirectional communication. The upload direction (computer → CL9) was already working fine using my Go utility. For interactive testing of the return channel I used the Serial Monitor as a plugin for VS Code, which makes it easy to send raw bytes and watch what comes back in real time.
The CL9 clearly responded to commands sent over the serial line — I could see its display reacting, and the timing of the signals suggested it was sending something back. But what arrived at the computer was not what the manual described. The data was garbled in a very consistent way, which is usually a good sign: consistent garbage often means a single systematic problem rather than random noise or a firmware issue.
The Oscilloscope Knows
I had a hunch about inverted signal polarity. RS-232 logic levels are "negative logic" — but depending on how the interface circuitry is implemented, the actual signal on the wire can end up inverted relative to what the UART expects.
Fortunately, I have an oscilloscope — a Rigol MHO984, which I've been putting to good use lately — so I could check the actual signal on the line rather than just guess. And indeed: the signal coming back from the CL9 was inverted. The idle state was at the wrong level, the start bit went the wrong polarity, and everything that followed was a mirror image of what my UART expected.
Mystery solved.
One Small Transistor
The fix was straightforward. I grabbed a KC508 — a general-purpose NPN transistor common in Czech and Slovak electronics, the local equivalent of a BC547 — and wired up a simple signal inverter on a breadboard. Two resistors, one transistor, a few jumper wires. The circuit inverts the signal from the CL9 before it reaches the serial adapter, and that's all it takes.

After that: everything worked. Data flows in both directions, the device responds correctly, and I can now read remote control code definitions back from the CL9 as well as write them.
It's one of those satisfying moments in hardware debugging where a single small component — a transistor that costs a few cents — is the difference between a broken workflow (and world) and a fully working one.