开源改变世界!!

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField() #16

推推 grbl 2年前 (2023-02-12) 368次浏览
关闭
petervanderwalt 打开了这个问题 2020 年 4 月 25 日 · 5 条评论
关闭

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField()#16

petervanderwalt 打开了这个问题 2020 年 4 月 25 日 · 5 条评论

评论

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField() #16
彼得范德沃尔特 评论了 2020 年 4 月 25 日  

参考

grbl_controller_esp32/com.cpp

第 195 至 201 行 bca2837

if ( getGrblPosState == GET_GRBL_STATUS_WPOS_HEADER ) { //分隔输入字段名称和值
getGrblPosState = GET_GRBL_STATUS_WPOS_DATA ;
wposOrMpos = strGrblBuf[ 0 ]; //保存应该是 MPos 或 WPos 的字符串的第一个字符
strGrblIdx = 0 ;
strGrblBuf[strGrblIdx] = 0 ;
wposIdx = 0 ;
} else if ( (getGrblPosState == GET_GRBL_STATUS_START || getGrblPosState == GET_GRBL_STATUS_CLOSED || getGrblPosState == GET_GRBL_STATUS_MESSAGE )

 

将问题追溯到上面的链接代码

如果我只是将 Serial.print 添加到调试中,我就能明白为什么它会失败:只是还没有深入到你的代码中来进行修复(编辑:见下面的回复)

添加了我的 serial.println:

case ':' :
      if ( getGrblPosState == GET_GRBL_STATUS_WPOS_HEADER ) { // separateur entre field name et value 
         getGrblPosState = GET_GRBL_STATUS_WPOS_DATA ; 
         wposOrMpos = strGrblBuf[0] ;       // save the first char of the string that should be MPos or WPos

         // lets see if it gets stored correctly
         Serial.println("");
         Serial.println(strGrblBuf);
         Serial.println("");

         strGrblIdx = 0 ;
         
         strGrblBuf[strGrblIdx] = 0 ;
         wposIdx = 0 ;
      }

我可以看到

<Idle|WPos:

Idle

0.000,0.000,0.000|FS:0,0>

那就是你存储 wposOrMpos = strGrblBuf[0] 的地方;strGrblBuf 仍然包含 Idle/Jog/Hold/etc 字符串,而不是预期的 wPos/mPos

随后, handleLastNumericField() 在检查时中断计算:

 if ( wposOrMpos == 'W') {                  // we got a WPos
            wposXYZA[wposIdx] = temp ;
          } else {                                   // we got a MPos
            wposXYZA[wposIdx] = temp - wcoXYZA[wposIdx] ;
          }

但是 wposOrMpos = “I”(在我当前的空闲状态下)所以我们总是点击“else”计算(:

如果我使用坐标偏移以及 $10=0(wpos 报告),则发现 wpos/mpos 数据不会正确出现。
默认 $10=1 它“有效”,mPos 报告由 handleLastNumericField 的“else”部分处理。但是,如果报告未设置为 $10=1,那么我们仍然会点击“else”,尽管它不应该。handleLastNumericField 中的代码部分显然打算处理这两种报告设置,只是之前它存储了错误的字符(:

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField() #16
作者
彼得范德沃尔特 评论了 2020 年 4 月 25 日  

知道了!

对,所以

grbl_controller_esp32/com.cpp

第 269 至 273 行 bca2837

} else if ( ( (c >= A && c <= Z ) || (c >= a && c <= z ) ) && ( getGrblPosState == GET_GRBL_STATUS_START || getGrblPosState == GET_GRBL_STATUS_HEADER ||
getGrblPosState == GET_GRBL_STATUS_CLOSED || getGrblPosState == GET_GRBL_STATUS_MESSAGE ) ) {
strGrblBuf[strGrblIdx++] = c ;
strGrblBuf[strGrblIdx] = 0 ;
}

 

还应该包括|| getGrblPosState == GET_GRBL_STATUS_WPOS_HEADER

即更改为

} else if ( ( (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ) && ( getGrblPosState == GET_GRBL_STATUS_START || getGrblPosState == GET_GRBL_STATUS_HEADER ||
                    getGrblPosState == GET_GRBL_STATUS_CLOSED || getGrblPosState == GET_GRBL_STATUS_MESSAGE || getGrblPosState == GET_GRBL_STATUS_WPOS_HEADER ) ) { 
             strGrblBuf[strGrblIdx++] = c ;
             strGrblBuf[strGrblIdx] = 0 ;
          }

现在它正确地将 Mpos/Wpos 附加到 strGrblBuf(虽然现在它是 IdleWPos 所以……

接下来在

grbl_controller_esp32/com.cpp

第 176 至 178 行 bca2837

如果(getGrblPosState == GET_GRBL_STATUS_START){
getGrblPosState = GET_GRBL_STATUS_WPOS_HEADER ;
memccpy ( machineStatus , strGrblBuf , \0 , 9 );

将字符串复制到 machineStatus 后,我清理了 strGrblBuf 和 strGrblIdx : 

if ( getGrblPosState == GET_GRBL_STATUS_START ) {
           getGrblPosState = GET_GRBL_STATUS_WPOS_HEADER ; 
           memccpy( machineStatus , strGrblBuf , '\0', 13);        
           strGrblIdx = 0;
           strGrblBuf[strGrblIdx] = 0 ;

现在 wposOrMpos = strGrblBuf[0] 并且 strGrblBuf 按预期正确包含 Mpos 或 WPos

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField() #16
作者
彼得范德沃尔特 评论了 2020 年 4 月 25 日  

U测试也不错!

我收到 WPos 反馈,其中包含 WCO 条目。并正确计算出 MPOS

<空闲|WPos:0.000,0.000,0.000|FS:0,0|WCO:92.188,0.000,0.000>
WCO – X:92.19 Y:0.000.00 A:0.00
WPOS – X:0.00 Y:0.00 Z:0.00 A :0.00
MPOS – X:92.19 Y:0.00 Z:0.00 A:0.00

我们可以关闭该问题,但将其保持打开状态以提醒您也应用修复

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField() #16
所有者

感谢您发现并解决问题。
我将在下一个版本中包括更正(我目前正在准备一个使用 sd 文件的解决方案,以便让用户强制执行新的触摸屏校准和更改 Wifi 参数而无需重新刷新)

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField() #16

感谢您发现并解决问题。
我将在下一个版本中包括更正(我目前正在准备一个使用 sd 文件的解决方案,以便让用户强制执行新的触摸屏校准和更改 Wifi 参数而无需重新刷新)

您好,我建议您自己设置 wifi 设置的 ip 地址(Dhcp 或修复 ip)
谢谢

解析器问题,未正确捕获 wposOrMpos,中断 handleLastNumericField() #16
所有者

较新版本支持修复 ip。