Marlin固件解析G代码部分分析
Marlin固件解析G代码部分分析
解析指令函数的主要作用就是提取命令缓冲区中命令的信息,完成解码工作,并将解码后的信息传递给其他程序块来执行。
解析指令具体的程序是通过的switch…case…结构实现的。通过读取缓冲区的命令置于switch case结构中解析,并将解码信息赋予相应的职能函数。
下面这三个对字符串操作进一步封装的函数在G指令解析中起着至关重要的作用。
/* 将strchr_pointer指针后的字符串中的数字转化为双精度数值 */float code_value(void) {return (strtod(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL));
}/* 将strchr_pointer指针后的字符串中的数字按十进制数转化为数值 */
long code_value_long(void)
{return (strtol(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL, 10));
}/* 如果字符“code”被找到,返回值为true */
bool code_seen(char code)
{strchr_pointer = strchr(cmdbuffer[bufindr], code);return (strchr_pointer != NULL); //Return True if a character was found
}
process_commands()函数原本的代码量是上千行的,这里我为了说明问题只保留了代码框架的结构。仔细看下面这个代码结构便会发现他的巧妙所在。
/* 解析G代码和M代码 */
void process_commands(void)
{ unsigned long codenum; //throw away variablechar *starpos = NULL;int8_t i;if(code_seen('G')) //读取到了字符G{switch((int)code_value()) //读取G后面的数字{```case 0: // G0 -> G1case 1: // G1if(Stopped == false) {get_coordinates(); // For X Y Z E Fprepare_move();return;}case 2: // G2 - CW ARCif(Stopped == false) {get_arc_coordinates();prepare_arc_move(true);return;}case 3: // G3 - CCW ARCif(Stopped == false) {get_arc_coordinates();prepare_arc_move(false);return;}case 4: // G4 dwellcodenum = 0;if(code_seen('P')) codenum = code_value(); //毫秒等待if(code_seen('S')) codenum = code_value() * 1000; //秒等待st_synchronize(); //synchronize使……合拍,同步codenum += millis(); //当开始等待时保持轨迹previous_millis_cmd = millis(); //记录历史值while(millis() < codenum ){manage_heater();manage_inactivity();}break;/*......*/ //略去了该部分程序
}
```}else if(code_seen('M')) { switch( (int)code_value() ){ /*......*/ //略去了该部分程序}}else if(code_seen('T')){ /*......*/ //略去了该部分程序}else{SERIAL_ECHO_START;printf(MSG_UNKNOWN_COMMAND);printf("%s",cmdbuffer[bufindr]);printf("\"");}ClearToSend();
}
上面保留了一些case部分,仔细看就会发现它像极了数控系统中的G1、G2、G3、G4,这便是其中的巧妙所在。
巧妙的利用了switch case结构来实现庞大的功能体系,同时也为新功能的增添提供了巨大的便利。
Marlin固件解析G代码部分分析相关推荐
- g代码解释程序 java_解析g代码c语言程序
g代码如下 T1M6 G17 G0Z5.000 G0X0.000Y0.000S15000M3 G0X6.920Y10.816Z5.000 G1Z0.000F240.0 G1X6.461Y10.758F ...
- SM3_CNC,轴组,G代码解析,CNC运动控制
选中对象> 按F1 //获取帮助 说明: 核心函数 SMC_NCInterpreter // SMC_NC解释器 SMC_Interpolator 插补算法 SM3_CNC库文档 ...
- 一种基于DirectX 9.0 API的G代码逆向渲染方法
G代码是一种工业加工描述语言,现在也广泛的运用于3D打印中.但G代码是一种单向的描述语言,很难逆向回三维模型.但近日,日本出现了一款名为MakePaintable的软件,它可以将G代码逆向回三维模型. ...
- dxf文件解析,g代码解析,图片解析C#工程文件
dxf文件解析,g代码解析,图片解析C#工程文件 1.解析完成的图形坐标自动保存,通过通信接口直接下发即可 2.可用于激光切割机,打印机,打码机,巡边机,点胶机等运动控制系统 ID:693000659 ...
- dxf文件解析,g代码解析,图片解析C#工程文件 可用于激光切割机,打印机,打码机,巡边机,点胶机等运动控制系统
dxf文件解析,g代码解析,图片解析C#工程文件 1.解析完成的图形坐标自动保存,通过通信接口直接下发即可 2.可用于激光切割机,打印机,打码机,巡边机,点胶机等运动控制系统 ID:483000659 ...
- CNC加工中心的G代码详细解析
G代码是数控程序中的指令.一般都称为G指令. 1. 代码功能 代码名称-功能简述 G00------快速定位 G01------直线插补 G02------顺时针方向圆弧插补 G03------逆时针 ...
- 3D 打印机 G 代码命令:完整列表和教程
3D 打印机 G 代码命令:完整列表和教程 查看原文 了解 G 代码命令将开启 3D 打印的下一个层次.继续阅读以快速了解此代码的基础知识! 内容 它是什么? 3D 打印的重要命令 G0 & ...
- marlin固件烧录教程_Marlin固件配置教程详解
首先从Marlin固件GitHub下载固件源代码,也可从Makeboard网盘下载. Marlin固件主要分为两个版本,一个是1.0.2-2版本,是稳定版,已经一年没怎么更新了,功能比较少,网上的教程 ...
- 使用 markdown-it 解析 markdown 代码(读 VuePress 三)
前言 在此系列文章的第一篇,我们介绍了 Vuepress 如何让 Markdown 支持 Vue 组件的,但没有提到非 Vue 组件的其他部分如何被解析. 今天,我们就来看看 Vuepress 是如何 ...
- 西门子1200PLC程序SCL数控G代码功能块源文件 S7-1200PLC程序SCL数控G代码功能块源文件
西门子1200PLC程序SCL数控G代码功能块源文件 S7-1200PLC程序SCL数控G代码功能块源文件 实际项目拆分出封装好的的功能块,保证好用 整个G代码解析的程序做成了一个FB功能块,总共约1 ...
最新文章
- python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码
- WEBBASE篇: 第五篇, CSS知识3
- WPF 基于 .NET 5 框架和 .NET 6 的 SDK 进行完全单文件发布
- 无法从服务器获得响应,什么是java.io.EOFException的,消息:无法从服务器读取响应。 预期读4个字节,...
- 菜鸟学Struts2——Interceptors
- C++ 多线程系统编程精要
- indesign中调出字符样式快捷键_Adobe indesign [ID]常用快捷键
- DLP迈向NG DLP的进化之路
- Google SketchUp Cookbook: (Chapter 2) Following Paths with Follow Me
- linux下使用top和pmap命令查看系统运行状态和进程运行状态
- Java随笔记 - Java BIO,Socket通信
- 华为和荣耀学编程计算机推荐,2020~2021笔记本电脑推荐(华为篇)
- H2O.ai初步使用
- 树莓派制作遥控小车教程
- 设有 4道作业,它们的提交时间及执行时间如下,试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。
- 建模助手 | 关于REVIT的小技巧,你知道多少?
- 学弟:功能测试转测试开发容易吗?
- linux 安装Mysql步骤
- 透明表——ABAP程序创建透明表
- 皮尔逊相关系数php,科学网—[严肃内容] 鲁索(Rousseau)教授对皮尔逊相关系数实质认识的图示 - 杨正瓴的博文...
热门文章
- “天外来客”讲述太阳系“童年”故事
- python数字右对齐_python怎么让数字右对齐?
- Read-a-Card 读取 RFID 卡
- sort和sorted的区别
- 报表控件FastReport.NET使用教程:如何在 Visual Studio 中使用报表组件
- 网络分析仪自动化测试软件,高效矢量网络分析仪自动测试方法
- 卡尔曼滤波原理与应用
- android脚本,安卓好用的脚本程序—Gscript
- 计算机主机显卡在哪里,台式电脑显卡在哪个位置 台式机显卡拆卸方法
- 9.屏幕宽高比判断(Screen.width,Screen.height)