And before I shut up tonight, with a little ASM, you wouldn't have to turn off interrupts at all.

Just download and include one of the (fairly) easy to find RS-232 ASM routines. Run it at 57600 baud. Set up a one-byte buffer. Have the PWM ISR check for a "buffer full" flag. If set, it jumps to the RS-232 routine and sends the byte, and when that routine is done sending the byte, it clears the "buffer full" flag. Since your PWM ISR is running at 2Khz, you have 500uSec between interrupts. But you can send a byte (at 57600) in 180uSec. Plenty of time.


Your main program loop could then just check the buffer full flag. If it wasn't set, it would write a byte the the buffer.

No stopping interrupts, and no corrupted data.