Arduino's SoftwareSerial library, based on NewSoftSerial by Mikal Hart, works pretty well for simple projects hwere you only do one thing at a time.‚Äč  But it keeps interrupts disabled during the entire byte plus start and stop bits.  For reception, an interrupt is used to detect the beginning, but delay loops keep the CPU from servicing any other interrupts until the byte is fully received.

For projects where you transfer data simultaneously on other ports, or run other libraries that need interrupts, I created AltSoftSerial.

AltSoftSerial uses timer interrupts for each signal change, so the CPU is available to do other work.  It tends to work with simultaneous data flow on other ports, and it can even transmit and receive simultaneously.

Reception is done with the timer input capture feature, which causes the hardware to capture the rapidly increasing timer value when the signal changes.  AltSoftSerial then analyzes the elapsed times to reconstruct the input data.

Transmission is done with the timer's compare units and waveform generator.  The timer's compare register is programmed to change the pin when the timer reaches the point where another signal change is needed to create the output data.

This project was started as a hack, just to see if I could get the timer to recognize the waveform.  After quite a bit of programming and at least one major redesign on the reception side, it's turned into a very usable replacement for SoftwareSerial, solving most of the CPU hogging trouble of SoftwareSerial, but of course with the caveat that it consumes a 16 bit timer.