From 67d824d914e16cdbcea59c0b861967bfbb949051 Mon Sep 17 00:00:00 2001 From: Ted Hess Date: Sat, 14 Oct 2017 11:39:25 -0400 Subject: [PATCH] Fix parsing of M110 command --- Firmware/Marlin_main.cpp | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d2e098205..66cad9630 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1497,14 +1497,16 @@ void get_command() } cmdbuffer[bufindw+serial_count+1] = 0; //terminate string if(!comment_mode){ - if ((strchr_pointer = strstr(cmdbuffer+bufindw+1, "PRUSA")) == NULL && (strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { - if ((strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) - { + // Line numbers must be first in buffer + if ((strstr(cmdbuffer+bufindw+1, "PRUSA") == NULL) && + (cmdbuffer[bufindw + 1] == 'N')) { + // Line number met. When sending a G-code over a serial line, each line may be stamped with its index, // and Marlin tests, whether the successive lines are stamped with an increasing line number ID. - gcode_N = (strtol(strchr_pointer+1, NULL, 10)); - if(gcode_N != gcode_LastN+1 && (strstr_P(cmdbuffer+bufindw+1, PSTR("M110")) == NULL) ) { - // M110 - set current line number. + gcode_N = (strtol(cmdbuffer + bufindw + 2, NULL, 10)); + if ((gcode_N != gcode_LastN + 1) && + (strstr_P(cmdbuffer+bufindw+1, PSTR("M110")) == NULL)) + { // Line numbers not sent in succession. SERIAL_ERROR_START; SERIAL_ERRORRPGM(MSG_ERR_LINE_NO); @@ -1542,21 +1544,23 @@ void get_command() return; } - gcode_LastN = gcode_N; + // Don't parse N again with code_seen('N') + cmdbuffer[bufindw + 1] = '$'; //if no errors, continue parsing - } // end of 'N' command - } - else // if we don't receive 'N' but still see '*' + gcode_LastN = gcode_N; + } + + // if we don't receive 'N' but still see '*' + if((cmdbuffer[bufindw + 1] != 'N') && (cmdbuffer[bufindw + 1] != '$') && + (strchr(cmdbuffer + bufindw + 1, '*') != NULL)) { - if((strchr(cmdbuffer+bufindw+1, '*') != NULL)) - { SERIAL_ERROR_START; SERIAL_ERRORRPGM(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM); SERIAL_ERRORLN(gcode_LastN); serial_count = 0; return; - } - } // end of '*' command + } + if ((strchr_pointer = strchr(cmdbuffer+bufindw+1, 'G')) != NULL) { if (! IS_SD_PRINTING) { usb_printing_counter = 10;