while loop delay the serialEvent function?

serialEvent should be based on interrupt

It probably should be, but it isn't. It's called after each execution of the loop() function...

int main(void)
{
	init();

#if defined(USBCON)
	USB.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}

	return 0;
}