Recibir mensaje con librería virtualwire y comparar el string

hola buenas, tengo un problema de codigo que no puedo resolver, lo que sucede es que con la libreria virtualwire estoy comunicando dos Arduinos mediante un transmisor y receptor de RF (433Mhz)

les adjunto el codigo para que se pueda entender mejor :

Transmisor :

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);  // abre el puerto de serie
    Serial.println("Transmisor listo"); // Imprime "listo" en el monitor serial
    pinMode(13, OUTPUT); //configura el pin 13 como salida, se usara el led integrado.
   
    vw_set_tx_pin(12);          // Configura el pin 12 como TX
    vw_set_ptt_inverted(true);  // Requerido para DR3100
    vw_setup(4000);        // Bits por segundo
}

void loop()
{
    digitalWrite(13, HIGH);      // Parpadeo para mostrar actividad
    char msg[] = "hello";   // Mensaje a enviar
    vw_send((uint8_t *)msg, strlen(msg)); //Enviando...
    vw_wait_tx(); // espera hasta que el mensaje se haya enviado
    Serial.println("Transmitiendo..."); // Imprime transmitiendo en el monitor serial
    delay(125);                 // Pausa antes repetir el ciclo
    digitalWrite(13, LOW);      // Parpadeo para mostrar actividad
    delay(125);                 // Pausa antes repetir el ciclo
         
}

Receptor:

#include <VirtualWire.h>

int count;

void setup()
{
    Serial.begin(9600); // abre el puerto de serie
    Serial.println("Receptor listo"); //Imprime "listo" en el monitor serial
    pinMode(13, OUTPUT); //configura el pin 13 como salida, se usara el led integrado.
    
    vw_set_rx_pin(12);       //Configura el pin 12 como TX
    vw_set_ptt_inverted(true); //Requerido para DR3100
    vw_setup(4000);     //  Bits por segundo
    vw_rx_start();       // Inciar el receptor
}

void loop()
{
    digitalWrite(13, HIGH);      // Parpadeo para mostrar actividad
    uint8_t buf[VW_MAX_MESSAGE_LEN]; //Almacenar en buffer los datos recibidos
    uint8_t buflen = VW_MAX_MESSAGE_LEN; //Determina el numero de caracteres recibidos
    if (vw_get_message(buf, &buflen)) // Si hay un mensaje recibido ejecuta...
    {
 int i; 
 int valor;

 valor = buflen;
  char c[valor];
        Serial.print(valor);    // imprime la cantidad de caracteres del mensaje
       Serial.print("  Rx: "); //imprime Rx en el monitor serial
 
 for (i = 0; i <= valor; i++)  //rutina para impresion del mensaje recibido
 {
  
            c[i] = {buf[i]}; // guarda el caracter recibido para despues imprimirlo
            Serial.print(c); //imprime el caracter recibido en el monitor serial
   // Serial.print(""); //deja un espacio en el monitor serial
 }
      //  Serial.print(c);
        count++;  //incrementa contador
        Serial.print(count);  //imprime el contador en el monitor serial
 Serial.println(" ");   // salto de linea monitor serial
   if (strcmp(c, "hello") == 0)
       {
           Serial.println("correcto");
           digitalWrite(13, LOW);
           delay(5000); 
           };
           
    }
    
                // Pausa antes repetir el ciclo
    digitalWrite(13, HIGH);  // Parpadeo para mostrar actividad
delay(5000);                 // Pausa antes repetir el ciclo
}

Como pueden ver en el Receptor almaceno el mensaje en un string para posteriormente comparar y realizar una acción si es correcto, pero lo que al final se imprime en el monitor serial es :

“5 Rx: hRÞhelloheRÞhellohelÞhellohellÞhellohellohellohello105
correcto”

pero y si quito el print que esta dentro del for , recibo esto del monitor serial :

"5 Rx: 3 "

y ahora ni si quiera me aparece el mensaje de qye esta correcta la comprobación.

hay muchas cosas que estoy haciendo mal, ojala que alguien me pudiera orientar .

Saldudos

PCS

¿Como determina el receptor donde acaba el mensaje y empieza el mensaje del siguente bucle?
Si como en el ejemplo, tu menaje es de cuatro caracteres, deberías partir el buffer cada cuatro caracteres (por ejemplo cambiando en el bucle for la variable valor por el numero 3), si por el contrario no sabes la longitud del mensaje que vas a enviar, deberías añadir un caracter conocido para poder partir el mensaje en el receptor cada vez que detecte determinado caracter, como un espacio, una barra, un salto de línea... Tal como esta el código, cada 250ms se envia un hello que se añade al buffer de receptor que lo lee de golpe todo cada 5s

si muchas gracias, ya encontré cual era mi problema, lo que sucede es que era como tu comentabas , no le ponía fin a mi vector , solo bastaba poner un c[valor]= ‘/0’; al final del for

for (i = 0; i <= valor; i++) //rutina para impresion del mensaje recibido
{

c = {buf*}; // guarda el caracter recibido para despues imprimirlo*
* Serial.print(c); //imprime el caracter recibido en el monitor serial*
* // Serial.print(""); //deja un espacio en el monitor serial*
}
c[valor]= ‘/0’;
* // Serial.print(c);*
por si alguin le sucede algo parecido , esta es la solucion,
Saludos