Restarting loop after interrupt

I have a requirement where I need to send a RF signal for a 10s time duration based on motions occur, I have used. I want to restart the sending when ever a new motion is detected so I used the following code

#include <PinChangeInterrupt.h>
#include <PinChangeInterruptBoards.h>
#include <PinChangeInterruptPins.h>
#include <PinChangeInterruptSettings.h>
#include <VirtualWire.h>

int i =0;
# define pir1 5
# define pir2 7
const int transmit_pin = 2;
unsigned long duration = 100;
unsigned int entry = 0;
char *msg = "A";

void setup() {

  Serial.begin(9600);
  pinMode(pir1, INPUT_PULLUP);
  pinMode(pir2, INPUT_PULLUP);

  attachPCINT(digitalPinToPCINT(pir1),set,RISING);
  attachPCINT(digitalPinToPCINT(pir2),set,RISING);
  
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
  
  digitalWrite(A2,LOW);
  digitalWrite(A3,LOW);
  
  vw_set_tx_pin(transmit_pin);
  vw_setup(2000);   // Bits per sec
  delay(5000);
  Serial.println("Start");
}

void loop() {
  
  
}

//void transmit(){
//Serial.println("Enterd loop");
//for(int i=0;i<20;i++){
//  
//  vw_send((uint8_t *)msg, strlen(msg));
//  vw_wait_tx(); // Wait until the whole message is gone
//  delay(500);
//  }
//  Serial.println("Message sent complete");
// 
//}

void set(){
  entry = millis();
  Serial.println("Enterd loop");
  Serial.println(entry);
  while(millis()- entry < duration){
     vw_send((uint8_t *)msg, strlen(msg));
       vw_wait_tx(); // Wait until the whole mes
       digitalWrite(13,HIGH);
       Serial.println(millis());
    }
    digitalWrite(13,LOW);
  Serial.println("Exit loop");
  Serial.println(millis());
  }

Issue is when a motion occur only "En" gets printed in Serial and it doesn't work after all, What have I done wrong, what is the better way.

What have I done wrong,

Completely misunderstood what interrupts are for, and what you can, and can not do, in an interrupt handler.

what is the better way.

Break the long task down into pieces that can be accomplished quickly. Do the next one on each pass through loop(), if it is time, after checking whether it is necessary to keep doing stuff.

It does not make sense to stream data when motion occurs. Tell the other end when motion started and when it ended (lying, if it is still going on after the desired time).

You are using Serial.print() in an ISR.
Interrupts are disabled when in an ISR
Serial.print() uses interrupts

Can you see how that might cause a problem ?

millis() is not updated when in an ISR
So, will

while (millis() - entry < duration)

work ?

In general keep an ISR run time down to a few tens or hundreds of microseconds at absolute most.

Interrupts are needed when things have to be handled in a timely manner on microsecond
timescales, or regularly at set points in time (timer interrupt).

Everything else you code for in loop(). Don't think about waiting for things, think about
checking for the next thing to do.