Wire-or Arduino TX pins

If each device has its own cable, the total cable length will be ~22meters*12devices. With the pull up resistor, the cable capacitance makes an RC low pass filter. Generally you want the time constant of your filter to be significantly less than half the time it takes to send one bit at whatever baud rate you are using. With the assumption that 22/4 cable isn't too much worse than cat5 in terms of capacitance it still might work, but it might be a tight squeeze.

You might actually want a 120 to 180 ohm resistor in series with the diodes in each device, just to avoid the large current spike that happens when the IO pin goes low and tries to discharge the entire bus capacitance all at once. Which will of course limit how low you can pull down the voltage unless you use a larger value of a pullup, which might limit your speed.

You might have to experiment a bit and/or lower your speed to 4800 or 2400 baud, which would really suck.

The CAN transceiver is starting to look like a better option. If it can carry i2c, it should be able to carry UART just fine, and signal reflections aren't usually an issue at low speeds. I'm planning on using the mcp2561, which is the 1$ one I mentioned.

If you want to do a polled protocol and not a collision detection wired or bus, you could just use RS485, but I think the transceivers cost slightly more and might not be quite as fault protected as the cheap CAN transceivers.