Simulação travando a comunicação serial

Boa noite galera! Venho aqui pois tenho um problema que já tem um tempo que tenho dificuldades em resolver.

Estou usando o Arduíno para fazer um robô de Sumô , e vou usar 3 sensores de distancia e 2 de linha(apenas na frente).
Entretanto , já revisei meu código , eu coloco ele para rodar no Proteus , ele executa a linha correta , mas depois a comunicação serial trava (apesar da porta ser emulada , nao sei se isso altera) . Vou mostrar minha idéia e depois posto o código.

Sensor de linha : leitura / Sensor de distancia : distance(frente) , distance2(direita) , distance3(esquerda);

Caso o sensor de linha detecte-a , ele terá prioridade e portanto o robo irá para trás
Caso esteja fora da linha da borda , ele então vai procurar o oponente e vai "virar" até ficar de frente para ele.
Se a distancia for menor do que distancia2 e 3 , ele estará na frente, portanto aciona 2 reles .
Se a distancia2 for menor que a distancia e distancia3 , ele estará à direita e vai virar enquanto distancia2<distancia(frente)
Se distancia 3 for menor que distancia e distancia2 , ele estára à direita e vai virar enquanto distancia3<distancia(Frente)
Ainda não coloquei casos especiais para caso o oponente esteja nas costas pois acaba "piorando" a situação , nenhum sinal de Serial chega na janelinha COM da IDE , portanto se ele nao detectar nada apenas fica parado.

Aqui vai o código

//CODIGO SENSOR DE DISTANCIA E LINHA USANDO SENSOR IR SHARP E SENSOR DE LINHA LDR , SIMULADOS NO PROTEUS//
//ALTERAVEL PARA O HC-SR04(ULTRASSOM)//
//DESENVOLVIDO PARA ROBOCAP POR LUIS DINIZ//
//FALTA COLOCAR PADRÕES PARA CASO NÃO HAJA DETECÇÃO DOS SENSORES DE DISTANCIA/LINHA (CASO ESTEJA FORA DO CAMPO DE "VISAO")

#include <DistanceGP2Y0A21YK.h>
DistanceGP2Y0A21YK Dist , Dist2 , Dist3;
int distance , distance2 , distance3;
int rele1 = 2 , rele2 = 3 , rele3 = 4 , rele4 = 5;

 void frente(){
   digitalWrite(rele3,LOW);digitalWrite(rele4,LOW);
   digitalWrite(rele1,HIGH);digitalWrite(rele2,HIGH);
 }
 void tras(){
   digitalWrite(rele1,LOW);digitalWrite(rele2,LOW);
   digitalWrite(rele3,HIGH);digitalWrite(rele4,HIGH);
 }
 void esquerda(){
   digitalWrite(rele3,LOW);digitalWrite(rele4,LOW);
   digitalWrite(rele2,LOW);digitalWrite(rele1,HIGH);
 }
 void direita(){
   digitalWrite(rele3,LOW);digitalWrite(rele4,LOW);
   digitalWrite(rele1,LOW);digitalWrite(rele2,HIGH);
 }

void setup()
{
  Serial.begin(9600);
  Dist.begin(A0);
  Dist2.begin(A1);
  Dist3.begin(A2);
  pinMode(rele1,OUTPUT);
  pinMode(rele2,OUTPUT);
  pinMode(rele3,OUTPUT);
  pinMode(rele4,OUTPUT);
}

void loop()
{
  distance = Dist.getDistanceCentimeter();
  distance2 = Dist2.getDistanceCentimeter();
  distance3 = Dist3.getDistanceCentimeter();
  Serial.print("\nDistancia Sensor Frente: ");
  Serial.print(distance);
  Serial.print("\nDistancia Sensor Direito : ");
  Serial.print(distance2);
  Serial.print("\nDistancia Sensor Esquerdo : ");
  Serial.print(distance3);
  int leitura = analogRead(A3);
  int leitura2 = analogRead(A4);
  Serial.print("\nLeitura LDR1 : ");
  Serial.print(leitura);
 
 delay(500);
 
 if(leitura>=307){
   if(distance < distance2 && distance < distance3){
     while(leitura >=307){
       tras();
     }
   }
   if(distance > distance3 && distance2 > distance3){
     while(leitura>=307){
       tras();
     }
   }
   if(distance > distance2 && distance3>distance2){
     while(leitura>=307){
       tras();
     }
   }
 }
 if(distance < distance2 && distance < distance3){ 
   frente();
 }
 if(distance > distance3 && distance2 > distance3){
   while(distance > distance3){
   esquerda();
   }
 }
 if(distance > distance2 && distance3>distance2){
   while(distance > distance2){
   direita();
   }
 }
}

Por exemplo , quando eu começo a simulação com distance<distance2 && distance<distance3 , ele corresponde sem travar.Ainda com a simulação rodando , quando eu diminuo distance3 , ficando =>
distance3<distance && distance<distance2 , ele responde à condição e inverte a rotação mas logo em seguida a comunicação trava.

Uma observação , a comunicação Serial trava quando o robo vira para algum dos lados
Espero alguma luz!! Obrigado!

Apaga os delays e estuda o que significa while em linguagem de programação.

Exatamente o que o bubulindo disse, tens um delay que trava o código por meio segundo, imagine o que pode acontecer neste meio segundo!

Outra que o while ocorre enquando a condição for verdadeira, então se tens "trava aqui enquanto distance > distance2". Pr começar, tira o delay e substitui os while por if, e reveja a lógica, pois com q atual imagino o robô meio doidão kkkk

cara , funcionou mesmo! Muito obrigado pela dica , agora eh começar implementar mais e pensar mais nos códigos hehe ,valeu!