si ...
Un break iria dentro de un while.. en tu caso se encuentra afuera, si lo pones dentro no tendria sentido. Por lo cual ese break deberia hacer absolutamente nada, tanto afuera como adentro.
El while se queda encerrado si es que los pines B3,B2 y B5 estan en 1, cualquiera que este en 0 haria que salga del while.
Asi que en realidad no estarias esperando que se presente un cambio, sino que algun nivel este en 0.
Eso una ves por vuelta. EL problema luego surge con el gets(), pueden ocurrir 2 problemas aca..
El primero es que debido al delay y al printf que tenes en wait_h_to_l() lleguen datos a la UART, y si no se sacan a tiempo implica un OVERRUN de la UART, es decir que llegaron mas de 1 dato y como tiene lugar para 1 solo, se perdieron.
El segundo problema es que si aun asi no llego nada, deberia si o si llegarte un retorno de carro \r o 0xD si no mal recuerdo, para que el gets salga, sino sigue guardando hasta que se quede sin memoria y sobreescribiendo otras variables.