Joe, I suggest you drop an anvil on it or perhaps set it on fire. No more hard faults.
Seriously though I think you are left with two paths.
-
Dissect the hard fault in detail using the link I posted earlier. That might help you reconstruct how you got to the hard fault.
-
Continue changing stimulus to narrow down the cause. You might try changing the parser to dump the zero byte or perhaps change a good byte into a zero byte just to see what happens. Or maybe don’t initialize the USART until after the break but manually insert a zero byte into the RX queue. Or any other ideas you might come up with to divide and conquer. If you have a suspect (like the break for example) then attack that.
(3. Use a full trace system but I’m guessing you don’t have that.)