Most common way of using interrupt for receive data is to read the character that did the interrupt, store it in a buffer (array), increment the array pointer. Then, check for any further characters. If none, exit interrupt. If last character received is a form of "end message", you set a flag "receive complete" in the interrupt routine and exit. If flags are already set, ignore received data until main program can process existing buffer array and clear the flags.
Main program then simply loops and checks if the buffer is complete ("receive complete"), and then process the array all at once in main program. Once done processing, clear the "end message" or "full buffer" and reset pointer flags. Same for sending, send from main program loop as interrupts are not necessary for sending data, usually (unless you have special needs to stop the TX data)