> Why is the stop bit necessary? > > My system reads serial by the following routine, called every 1/baudrate secs > . > ...... > By this method, the next start bit can come immediately after the last > data bit. Yes, but you can't recover from an error - the stop bit allows you to search for a guaranteed transition when you're out of sync. You still might misinterpret a data transition as the start bit, but you'll soon see another error (a framing error in async nomenclature) and that can cause you to look for a valid stop bit again. Sooner or later, you'll resync correctly. > Problems occur if the routine happens to be called on the transition > edges of the data. I`m already using the edge trigger bit on RB0 for > another serial comms system, and have some maths running "in the > background". How can I force it to read the centre of the pulses? Look for transitions as well as sampling levels - when you detect a transition, rearrange your bit-time timer so that the next level sampled is 1/2 a bit-time later. A more sophisticated algorithm would slide the sample points in response to edge positions (instead of jumping) so that transitions due to noise would cause minimal disturbance to your timing. This is the way hardware UARTs work, often with a counter running at 16x bitrate to define the sample time. The value of the counter is adjusted when a transition occurs to help keep the transitions 1/2 a bit-time away from the sampling point. It's a digital implementation of a phase-locked loop. -adrian