Arduino MKR GSM 1400 fails to start up without Serial Monitor This question is similar to another question, but I have added more details. See: MKR GSM 1400 Works only when connected to computer.
I have designed and built a custom board into which I plug an Arduino MKR GSM 1400. It's a basic IO abstraction level shifter as the system I am integrating to run on 24V logic (done via opto-couplers). Everything is working perfectly and as-designed. I've added an I2C EEPROM.
When I boot the board from an external ATX supply +12V line it doesn't complete setup. After I've left it for some time, I connect it to my PC USB port and open the serial monitor in the Arduino IDE and it simply completes the setup process and enters loop successfully.
Voltages are perfect. The 12-24V supply is first fed through a standard 7810 (since I need +10V for the analog lines of the controlled system) and then a 7805. The +5V output of the 7805 is sent into the Vin of the Arduino. Measuring VIN with a DMM reads +5.07V and VCC reads +3.33V. I have a 3.7V 300mAh 25C Li-Po connected to the battery port on the Arduino, to deal with the current requirements as specified in the documentation.
I thought this could be a power issue, so I also tried booting it with a 10Ah USB Power bank that has 2 x 5V 2A (3A Max) USB ports. Same result, until I connect the PC with the serial monitor.
Simplified Arduino Code:

#include &lt;MKRGSM.h&gt;
#include &lt;Wire.h&gt;

GSM gsm;
GPRS gprs;
GSMServer server(80);
GSMSSLClient client;
GSM_SMS sms;

void setup() {
  //Initialise Serial
  Serial.begin(9600);
  while(!Serial)
  {}
  Serial.println(&quot;Gineer.Industrial.GSM.Controller&quot;);
  Serial.println(&quot;www.gineer.co.za&quot;);
  Serial.print(&quot;Hardware Version: &quot;);
  Serial.println(hwVersion);
  Serial.print(&quot;Software Version: &quot;);
  Serial.println(swVersion);
  Serial.println();

  
  Serial.print(&quot;Connecting&quot;);

  bool connected = false;

  while (!connected) {

&gt;&gt;&gt; Here is where it gets stuck until I plug in the USB Serial Monitor, and then it continues happily

    if ((gsm.begin(SIMpinNumber) == GSM_READY) &amp;&amp;
        (gprs.attachGPRS(SIMgprsAPN, SIMgprsLogin, SIMgprsPassword) == GPRS_READY)) {
      connected = true;
    } else {
      Serial.print(&quot;.&quot;);
      delay(1000);
    }
  }
.
.
.

Interestingly, the +5V output pin on the Arduino measures 4.68V when not connected to the PC. I don't however use this pin as I have the 7805 on my board. All other voltages measure as above at all times.
while(!Serial) {} will wait for a serial connection and in your program will block execution until it gets one.
Remove it and your program should continue without the serial monitor.