Hardware Serial Buffer with multiple High Speed Devices

delay(500);

Waiting half a second is NOT a small delay! With a GPS sending at 10Hz you're loosing 5 positions. This is probably not a problem but may show you that is an incredibly long time for a microcontroller.

Then you're calling your waitForOK() function recursively without limiting the recursion. This is a potential dead lock.

Another problem: You're using the String class which is badly coded for an embedded environment. The String class is designed for PC operating systems which feature Memory Management Units and much more memory (by about a factor of a million and more). It shouldn't be used in code for Arduinos (and MCU systems) that needs to run for more than a few loops (so about everything but the most simple test sketches). Forget about that class and use character arrays instead.