GRBL分析:gcode解释器(二)

本文详细介绍了GCode解释器中的关键函数gc_execute_line,该函数负责G代码的解析,将接收到的G代码转化为内部结构进行处理。内容包括函数功能描述、参数说明、返回值解释及部分G代码处理流程。通过对G00、G01、G02和$J=G21G91等命令的解析流程描述,揭示了函数内部的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCode解释器 - gc_execute_line函数解析

更新记录

2021-8-23
  • 添加函数功能描述
2021-8-24
  • 添加简单的流程绘制

函数功能描述

函数原型

uint8_t gc_execute_line(char *line);
参数 char* line
  • 在 protocol.c 文件的 protocol_main_loop 函数中,主循环内部会处理串口接收到的字符串,将接收的字符串进行过滤处理后,得到的是G代码则会在循环中调用 gc_execute_line 函数进行G代码的解析。
  • line指针指向的为 protocol.c 中声明的数组,该数组存储的为从串口中提取的有效数据信息。
static char line[LINE_BUFFER_SIZE]; // Line to be executed. Zero-terminated.
返回值

返回该条G代码的处理结果
在 report.h 文件中定义了相关的返回结果

定义宏返回值描述
STATUS_OK0G代码处理完成,无错误
STATUS_EXPECTED_COMMAND_LETTER1G代码中出现了非法字符
STATUS_BAD_NUMBER_FORMAT2数值格式无效或缺少预期值
STATUS_INVALID_STATEMENT3无法识别或支持 Grbl ‘$’ 系统命令
STATUS_NEGATIVE_VALUE4收到的预期正值的负值
STATUS_SETTING_DISABLED5
STATUS_SETTING_STEP_PULSE_MIN6
STATUS_SETTING_READ_FAIL7EEPROM 读取失败。重置并恢复为默认值
STATUS_IDLE_ERROR8
STATUS_SYSTEM_GC_LOCK9
STATUS_SOFT_LIMIT_ERROR10
STATUS_OVERFLOW11
STATUS_MAX_STEP_RATE_EXCEEDED12
STATUS_CHECK_DOOR13
STATUS_LINE_LENGTH_EXCEEDED14
STATUS_TRAVEL_EXCEEDED15
STATUS_INVALID_JOG_COMMAND16
STATUS_SETTING_DISABLED_LASER17
STATUS_GCODE_UNSUPPORTED_COMMAND20
STATUS_GCODE_MODAL_GROUP_VIOLATION21
STATUS_GCODE_UNDEFINED_FEED_RATE22
STATUS_GCODE_COMMAND_VALUE_NOT_INTEGER23
STATUS_GCODE_AXIS_COMMAND_CONFLICT24
STATUS_GCODE_WORD_REPEATED25
STATUS_GCODE_NO_AXIS_WORDS26
STATUS_GCODE_INVALID_LINE_NUMBER27
STATUS_GCODE_VALUE_WORD_MISSING28
STATUS_GCODE_UNSUPPORTED_COORD_SYS29
STATUS_GCODE_G53_INVALID_MOTION_MODE30
STATUS_GCODE_AXIS_WORDS_EXIST31
STATUS_GCODE_NO_AXIS_WORDS_IN_PLANE32
STATUS_GCODE_INVALID_TARGET33
STATUS_GCODE_ARC_RADIUS_ERROR34
STATUS_GCODE_NO_OFFSETS_IN_PLANE35
STATUS_GCODE_UNUSED_WORDS36
STATUS_GCODE_G43_DYNAMIC_AXIS_ERROR37
STATUS_GCODE_MAX_VALUE_EXCEEDED38

函数功能

  • 该函数会处理G代码,将G代码转化为一个 gc_block 结构,之后再将 gc_block 交给后面的结构进行处理。
  • 该函数仅负责G代码的解析,仅提取G代码中的数据,形成相关结构,不会对数据进行任何的处理。

内部处理流程

由于对部分G代码不是特别清楚,该部分仅描述G00,G01,G02,$J=G21G91 四种命令的处理流程

在这里插入图片描述

ain()主函数首先执行下面初始化函数 serial_init(); // Setup serial baud rate and interrupts settings_init(); // Load Grbl settings from EEPROM stepper_init(); // 配置步进方向和中断定时器 system_init(); // 配置引脚分配别针和pin-change中断 memset(&sys, 0, sizeof(system_t)); // Clear all system variables sys.abort = true; // Set abort to complete initialization 完成初始化设置中止 sei(); // Enable interrupts #ifdef HOMING_INIT_LOCK //宏运算(settings.flags & (1 << 4)) != 0结果flags等于执行sys.state = STATE_ALARM //系统状态赋为报警状态 if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; } #endif _____________________________________________________________________________________________________________________________________ 接下来是一些主要初始化循环 for(;;) { serial_reset_read_buffer(); // Clear serial read buffer gc_init(); // Set g-code parser to default state spindle_init(); //主轴 coolant_init(); //冷却液 limits_init(); //极限开关 probe_init(); //探测 plan_reset(); // Clear block buffer and planner variables 清晰块缓冲区和规划师变量 st_reset(); // Clear stepper subsystem variables. 清晰的步进系统变量。 // Sync cleared gcode and planner positions to current system position. 同步清除gcode和策划师职位当前系统位置。 plan_sync_position(); gc_sync_position(); // Reset system variables. sys.abort = false; //系统中止标志 sys_rt_exec_state = 0; //系统执行标志状态变量状态位清零。 sys_rt_exec_alarm = 0; //系统执行警报标志变量清零。 sys.suspend = false; //系统暂停标志位,取消,和安全的门。 sys.soft_limit = false; //系统限制标志状态机复位。(布尔) protocol_main_loop(); //主协议循环 } // ___________________________________________________________________________
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值