diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h
index 787cb1210372879dd0b6e3d9e2eeaed3f0e1713d..1294b5ebec681669b2f04c8d8cfeb00f01971af8 100644
--- a/Marlin/Marlin.h
+++ b/Marlin/Marlin.h
@@ -109,7 +109,6 @@ void serial_echopair_P(const char* s_P, float v);
 void serial_echopair_P(const char* s_P, double v);
 void serial_echopair_P(const char* s_P, unsigned long v);
 
-
 // Things to write to serial from Program memory. Saves 400 to 2k of RAM.
 FORCE_INLINE void serialprintPGM(const char* str) {
   char ch;
@@ -119,8 +118,6 @@ FORCE_INLINE void serialprintPGM(const char* str) {
   }
 }
 
-void get_command();
-
 void idle(
   #if ENABLED(FILAMENTCHANGEENABLE)
     bool no_stepper_sleep=false  // pass true to keep steppers from disabling on timeout
diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index 423be9d53464710f68e3f5acb70833a988ced5f0..f3fb8876d05d207ebcbdeaccf7d513c9859985fe 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -462,6 +462,7 @@ static bool send_ok[BUFSIZE];
  * ***************************************************************************
  */
 
+void get_available_commands();
 void process_next_command();
 
 void plan_arc(float target[NUM_AXIS], float* offset, uint8_t clockwise);
@@ -804,7 +805,7 @@ void setup() {
  *  - Call LCD update
  */
 void loop() {
-  if (commands_in_queue < BUFSIZE) get_command();
+  if (commands_in_queue < BUFSIZE) get_available_commands();
 
   #if ENABLED(SDSUPPORT)
     card.checkautostart(false);
@@ -856,24 +857,16 @@ void gcode_line_error(const char* err, bool doFlush = true) {
   serial_count = 0;
 }
 
-/**
- * Add to the circular command queue the next command from:
- *  - The command-injection queue (queued_commands_P)
- *  - The active serial input (usually USB)
- *  - The SD card file being actively printed
- */
-void get_command() {
-
+inline void get_serial_commands() {
   static char serial_line_buffer[MAX_CMD_SIZE];
   static boolean serial_comment_mode = false;
 
-  if (drain_queued_commands_P()) return; // priority is given to non-serial commands
-
+  // If the command buffer is empty for too long,
+  // send "wait" to indicate Marlin is still waiting.
   #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0
     static millis_t last_command_time = 0;
     millis_t ms = millis();
-
-    if (!MYSERIAL.available() && commands_in_queue == 0 && ms - last_command_time > NO_TIMEOUTS) {
+    if (commands_in_queue == 0 && !MYSERIAL.available() && ms > last_command_time + NO_TIMEOUTS) {
       SERIAL_ECHOLNPGM(MSG_WAIT);
       last_command_time = ms;
     }
@@ -988,9 +981,11 @@ void get_command() {
     }
 
   } // queue has space, serial has data
+}
 
-  #if ENABLED(SDSUPPORT)
+#if ENABLED(SDSUPPORT)
 
+  inline void get_sdcard_commands() {
     static bool stop_buffering = false,
                 sd_comment_mode = false;
 
@@ -1050,8 +1045,26 @@ void get_command() {
         if (!sd_comment_mode) command_queue[cmd_queue_index_w][sd_count++] = sd_char;
       }
     }
+  }
 
-  #endif // SDSUPPORT
+#endif // SDSUPPORT
+
+/**
+ * Add to the circular command queue the next command from:
+ *  - The command-injection queue (queued_commands_P)
+ *  - The active serial input (usually USB)
+ *  - The SD card file being actively printed
+ */
+void get_available_commands() {
+
+  // if any immediate commands remain, don't get other commands yet
+  if (drain_queued_commands_P()) return;
+
+  get_serial_commands();
+
+  #if ENABLED(SDSUPPORT)
+    get_sdcard_commands();
+  #endif
 }
 
 bool code_has_value() {
@@ -7362,7 +7375,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) {
       filrunout();
   #endif
 
-  if (commands_in_queue < BUFSIZE) get_command();
+  if (commands_in_queue < BUFSIZE) get_available_commands();
 
   millis_t ms = millis();