bubulindo:
Acho que descobriste o teu problema...Para fazer o que pretendes, eu olharia a implementar uma função que corre com base no tempo (pesquisa por Timer1 interrupt) e programaria ela para interromper o programa de x em x tempo para processar os passos em vez de bloquear o programa.
Falhando isso podes dar instruções mais pequenas de step() dando assim hipótese de processar código entre passos. Não é processamento paralelo, mas dará a sensação disso.
Quanto ao teu problema de não aceitar comandos, parece-me óbvio porquê... não podes ler da porta série em dois sítios diferentes. Imagina que tu mandas um comando para acender uma lampada, mas a função que é chamada logo a seguir é a controlandoPortao()... o que vai acontecer é que o comando é ignorado.
Assim sendo eu criaria uma função para tratar da porta série em separado dessas funções e mediante o comando recebido, executarias uma função para cada um dos comandos.
A função controlandoPortao() sozinha funciona bem. Sendo assim eu digo que o único problema é mesmo a porta série.