David did not post any of the IRQ code here, but it should include an overflow check.
You should also check the overflow flag from the IRQ routine and if you are not certain of the adequacy of the buffer size, you may want to include a variable to store the max buffer space used.
Maybe this is a nit, but depending on the details of the message, you may need to recognize that you have not found a match and need to read to the end of the message before starting to scan for the next start of message.
That is an important point. Mainly due to code size limitations in embedded micros, you often have to work without the standard libraries. Instead of printf, you will need to use a simple itoa function.
I worked on a device that used a GPS module this way. The guys writing the code had to convert from NMEA lat/long to GMRS which is similar to UTM. They decided to use canned code that used 16 kB of library code in a 64 kB MCU! The result is that the total code was over 32 kB and we had a requirement to leave 40% free. So then they were afraid to add even simple stuff like ADC code to check the power supply voltages for selftest.
They also did everything in the interrupt code so that the idle loop was just that, a loop doing *nothing*! We also had to minimize our power consumption and my plan was to put the MCU in a low power state when it was idling. I thought the "idle" loop would make this very useful, but they didn't want to do that!