Salir del bucle while pasado unos milisegundos

Hola. Estoy controlando una serie de dispositivos que funcionan mediante el protocolo MODBUS pero a veces funcionan otras no, el caso es que deja el arduino en un bucle infinito pillado.

for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand1[i]);

 delay(50);

// Set pin to LOW > Receive mode
digitalWrite(RS485_control, LOW);
 
// Waiting for receive reply
while ( Serial2.available()<9); 
 
// Read reply in Buffer[];
for (int i=0; i < 9; i++) Buffer[i] = Serial2.read();

 float x;
 ((byte*)&x)[3]= Buffer[3];
 ((byte*)&x)[2]= Buffer[4];
 ((byte*)&x)[1]= Buffer[5];
 ((byte*)&x)[0]= Buffer[6];
 
 return x;

Se debe de quedar esperando el bucle while que veis en el código porque el dispositivo no responde, ahora tengo un perro guardián que lo resetea pero el programa empieza de nuevo y no me interesa, mi duda es, existe alguna forma de salir del bucle while pasado x tiempo y en caso de que se salga de esa forma violenta devuelva X un valor determinado que interprete como error? en el return x

un saludo

Hola

Coloca una variable antes de entrar en el bucle que lea el tiempo con millis();.

Ve comparando esa variable con el millis() dentro el bucle y cuando supere el valor de milisegundos que le indiques, que salga del bucle con break;

Algo así.

for (int i=0; i < 8; i++) Serial2.write(VoltageReadCommand1[i]);

 delay(50);

// Set pin to LOW > Receive mode
digitalWrite(RS485_control, LOW);
 
// Waiting for receive reply
//Imagino que será aqui donde entra en espera
unsigned long time_start= millis();

while ( Serial2.available()<9);
if(millis()-time_start>2000) break; //2000 milisegundos = 2 segundos 
// Read reply in Buffer[];
for (int i=0; i < 9; i++) Buffer[i] = Serial2.read();

 float x;
 ((byte*)&x)[3]= Buffer[3];
 ((byte*)&x)[2]= Buffer[4];
 ((byte*)&x)[1]= Buffer[5];
 ((byte*)&x)[0]= Buffer[6];
 
 return x;

No lo he podido probarlo, pero espero que sirva de algo.

Un saludo

Seria mejor programar bien la condicion del bucle:

while ( Serial2.available()<9);

Esto se cumple incluso cuando no hay datos que leer y Serial2.available() devuelve 0.En esa condicion no deberias entrar a leer nada porque no hay nada que leer,por otro lado ,si en el buffer se acumulan mas de 9 bytes ,no va entrar en el bucle o se va a salir si ya estaba dentro.

Cuidado con los tiempos en MODBUS, requiere un timing de 3.5 mseg para sus operaciones, jugar con retardos puede provocar fallas, asi que se debe tener cuidado y de ningún modo frenar el flujo del programa.