Why does serial.read stop working?

It appears that you could reduce this to fewer states (or none). All the recipe needs is a list of temperatures and how long each needs to be maintained. Perhaps additionally a flag to tell the system whether it needs to signal you to take action before moving on to the next temperature. Perhaps a name for the operation it's carrying out.

No need for XML therefore - you can just send a comma separated string, copy it into a buffer and parse it as you need to get the next step.