FIFO-related data transmission problems between microcontroller and PC
In general an interrupt-driven transmit protocol must always be started from somewhere outside the interrupt.

But do you realy need interrupts? This sounds like a fialy simple application: main loop checks for a few possible situations:


timer expired: start A/D conversion
A/D conversion completed: put result in queue
! received: set transmitting allowed
transmitting allowed and not transmitting: if queue not empty : pop result; clear transitting allowed; set transmitting
uart buffer empty: transmit next character, or clear transmitting if none available


The transmit part might be cleared if expressed in an STD.