freeRam() causes freeze

In your ListenForController method you are using the String class and the + operator to add characters to it. This has the effect of causing the String to re-allocate for it's backing char array every time you get a new character. That can cause memory fragmentation and cause you to run out of SRAM fast and has been known for some time to freeze Arduino programs.

The String class is great on PCs with lots of RAM. On micros it works OK in small programs, but stuff like this it is notorious for locking up.