Ещё укажу на одну оплошность
Не нужно городить много кода в прерывании. Туда нужно зайти, что-то быстро сделать, допустим положить принятый байт в буфер, и выйти
UPD:
И ещё флаг поднять, что какие-то данные приняты. Потом в основном цикле программы его отслеживать и уже там обрабатывать все команды и пересылать что-то в ответ