Browse Source

Fix printer resets in farm mode if command "PRUSA SN" is received and 32U2 processor is not responding.

Marek Bel 7 years ago
parent
commit
388d6eea36
1 changed files with 40 additions and 26 deletions
  1. 40 26
      Firmware/Marlin_main.cpp

+ 40 - 26
Firmware/Marlin_main.cpp

@@ -2508,35 +2508,49 @@ void gcode_M701()
 }
 /**
  * @brief Get serial number from 32U2 processor
+ *
+ * Typical format of S/N is:CZPX0917X003XC13518
+ *
+ * Command operates only in farm mode, if not in farm mode, "Not in farm mode." is written to MYSERIAL.
+ *
+ * Send command ;S to serial port 0 to retrieve serial number stored in 32U2 processor,
+ * reply is transmitted to serial port 1 character by character.
+ * Operation takes typically 23 ms. If the retransmit is not finished until 100 ms,
+ * it is interrupted, so less, or no characters are retransmitted, only newline character is send
+ * in any case.
  */
 static void gcode_PRUSA_SN()
 {
-    if (farm_mode) { 
-        selectedSerialPort = 0; 
-        MSerial.write(";S"); 
-        // S/N is:CZPX0917X003XC13518 
-        int numbersRead = 0; 
-
-        while (numbersRead < 19) { 
-            while (MSerial.available() > 0) { 
-                uint8_t serial_char = MSerial.read(); 
-                selectedSerialPort = 1; 
-                MSerial.write(serial_char); 
-                numbersRead++; 
-                selectedSerialPort = 0; 
-            } 
-        } 
-        selectedSerialPort = 1; 
-        MSerial.write('\n'); 
-        /*for (int b = 0; b < 3; b++) { 
-            tone(BEEPER, 110); 
-            delay(50); 
-            noTone(BEEPER); 
-            delay(50); 
-        }*/ 
-    } else { 
-         MYSERIAL.println("Not in farm mode."); 
-    } 
+    if (farm_mode) {
+        selectedSerialPort = 0;
+        MSerial.write(";S");
+        int numbersRead = 0;
+        Timer timeout;
+        timeout.start();
+
+        while (numbersRead < 19) {
+            while (MSerial.available() > 0) {
+                uint8_t serial_char = MSerial.read();
+                selectedSerialPort = 1;
+                MSerial.write(serial_char);
+                numbersRead++;
+                selectedSerialPort = 0;
+            }
+            if (timeout.expired(100)) break;
+        }
+        selectedSerialPort = 1;
+        MSerial.write('\n');
+#if 0
+        for (int b = 0; b < 3; b++) {
+            tone(BEEPER, 110);
+            delay(50);
+            noTone(BEEPER);
+            delay(50);
+        }
+#endif
+    } else {
+        MYSERIAL.println("Not in farm mode.");
+    }
 }
 
 void process_commands()