I’d be interested in the wave form, it should be 104ms square waves per bit. Yes it looks like this isn’t good code for this usecase, and receiving an entire byte with interrupts (in theory) off blocks for ~100us x 21 = 2.1ms which is a very long time for this processor…I will try porting AltSoftSerial that uses timers and blocks per bit instead. Thing that work on 8Mhz 8bit processors don’t directly translate to 32bit 48Mhz ones.
I’m not convinced that noInterrupts() turns off all interrupts either as TX works most of the time but has repeated identical pulses of corrupt data over time.
It’s an odd thing that a higher bps would block for less time individually too, but then timing requires more precision.