Completion of serial transmission - strange behaviour

How about starting the timeout (by saving the value of micros() ) when you start sending the data. If you know how many bytes you send then the time taken to send them should be easy to calculate. And if you are working to a 12msec interval no great precision seems to be required such that Hardware Timers add any value.

It would also mean that the timeout was entirely separate from the finer detail needed to decode a response if one arrives.

...R