However, for some unknown (at least to me) reasons, without that delay it doesn't work.
Serial data arrives slowly. If there is at least one character to be read, you read as many as 4 with just this snippet.
if (SerialUSB.available() > 0) {
char1 = SerialUSB.read();
if (char1 == 'L'){ // Codice "L" indica che voglio abilitare il led
delay (11);
// leggo 4 caratteri (1 numero board, 2 numero riga, 3 numero colonna, 1 per indicare lo stato 0 o 1 per spento/acceso
lednumber = "";
lednumber += char(SerialUSB.read());
lednumber += char(SerialUSB.read());
lednumber += char(SerialUSB.read());
The delay() is needed to make sure that there is something to read. It is, of course, NOT the way to read serial data.
Oh, and using Strings is far slower that using strings (or, even better, in your case, byte arrays).