# 支持伪代码的gcode sender **Repository Path**: JackGao19700/gcode_sender ## Basic Information - **Project Name**: 支持伪代码的gcode sender - **Description**: 一个功能强大的 G-Code 发送器,专为支持 GRBL 固件的 CNC 设备设计。它不仅支持标准的 G-Code 发送,还提供了强大的伪指令系统,可以在 G-Code 文件中嵌入控制逻辑,实现循环、条件判断、变量操作等高级功能。提供编程能力. - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-22 - **Last Updated**: 2026-02-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 支持伪指令的G-Code发送器使用文档 ============== 概述 -- 这是一个功能强大的 G-Code 发送器,专为支持 GRBL 固件的 CNC 设备设计。它不仅支持标准的 G-Code 发送,还提供了强大的伪指令系统,可以在 G-Code 文件中嵌入控制逻辑,实现循环、条件判断、变量操作等高级功能。 主要特性 ---- ### 1\. **完整的 GRBL 协议支持** * 实时命令 (`~`, `!`, `?`, Ctrl-X) * 系统命令 (`$`, `$$`, `$#`, `$G`, `$I`, `$N`, `$X`, `$H` 等) * 标准 G-Code 命令 * 自动等待 `ok` 响应,实现流控 ### 2\. **强大的伪指令系统** 伪指令以 `@` 开头,可以嵌入在 G-Code 文件中,提供编程能力: #### 变量操作 ```text @var count = 0 @var total = 100 @var result = a * b + 10 ``` #### 循环控制 ```text @for i in range(5) G91 G1 X10 F1000 @next i @for item in [10,20,30,40] G91 G1 X@item F1000 ;@item为引用变量语法 @next item ``` #### 条件判断 ```text @if count > 5 goto end @if flag == true total = 100 @if mode == 1 m114 x@x_pos y@y_pos ;@x_pos, @y_pos是变量引用 ``` #### 跳转控制 ```text @label start G91 G1 X10 F1000 @var count = count + 1 @if count < 10 goto start ``` #### 函数调用 ```text @sleep(500) ; 延时500ms @log("当前位置:", x) ; 自定义日志函数 @calculate(a, b, '+') ; 自定义计算函数 ``` #### G-Code 中的变量替换 ```text G1 X@x_pos Y@y_pos Z@z_pos F@speed ;@x_pos,@y_pos,@z_pos,@speed都是变量引用 M114 X@(pos_x) Y@(pos_y) ; 支持复杂表达式 G0 X@(i*2+offset) Y@(j*3-5) ``` ### 3\. **智能预处理** * 自动收集标签并建立跳转映射 * 建立 for-next 循环对应关系 * 解析 G-Code 中的变量表达式 * 验证语法正确性 ### 4\. **安全执行环境** * 限制 `eval` 只访问安全的模块 * 提供自定义函数接口 * 详细的错误提示 安装 -- ### 依赖安装 ```bash pip install pyserial ``` 快速开始 ---- ### 1\. 基本使用 ```python from gcode_main import PseudoInstructionProcessor, GCodeSender # 创建处理器 processor = PseudoInstructionProcessor() # 创建发送器 sender = GCodeSender( scriptProcessor=processor, port='COM3', # Windows 串口 # port='/dev/ttyUSB0', # Linux 串口 baudrate=115200, verbose=True ) # 连接设备 if sender.connect(): # 发送 G-Code 文件 sender.send_gcode_file('example.gcode') sender.disconnect() ``` ### 2\. 命令行使用 ```bash # 列出可用串口 python gcode_main.py --list-ports # 发送 G-Code 文件 python gcode_main.py -p COM3 example.gcode # 详细模式 python gcode_main.py -p COM3 -v example.gcode # 指定波特率 python gcode_main.py -p COM3 -b 115200 example.gcode # dryrun,忽略-p -b参数,不连MCU,仅仅查看gcode scripts文件真正的gcode代码 python gcode_main.py example.gcode ``` 伪指令详细说明 ------- ### @var - 变量定义 定义变量并赋值,支持任意 Python 表达式。 ```text @var count = 0 @var total = 100 * 2 @var name = "part_" + str(index) @var result = math.sqrt(a*a + b*b) ``` ### @for / @next - 循环 支持任意可迭代对象的循环。 ```text ; 数字范围循环 @for i in range(10) G91 G1 X10 F1000 @next i ; 列表循环 @for value in [10, 20, 30, 40] G91 G1 X{value} F1000 @next value ; 字典循环 @for key in {'x':100, 'y':200}.keys() G91 G1 {key}10 F1000 @next key ``` ### @if - 条件判断 三种格式: 1. 条件跳转:`@if condition goto label` 2. 条件赋值:`@if condition var = expression` 3. 条件 G-Code:`@if condition gcode` ```text ; 条件跳转 @if count > 5 goto end ; 条件赋值 @if x < 10 offset = x * 2 + 5 @if flag == true result = data[i] * factor ; 条件 G-Code @if mode == 1 g0 x@target_x y@target_y @if status == "home" m114 x@pos y@pos ``` ### @goto - 无条件跳转 跳转到指定标签或行号。 ```text @label start G91 G1 X10 F1000 @var i = i + 1 @if i < 10 goto start @goto end ; ... 中间的代码被跳过 @label end ``` ### @label - 标签定义 定义跳转目标。 ```text @label start @label loop_begin @label end_program ``` ### @function - 函数调用 调用自定义函数(需要提供函数实现)。 ```text @sleep(500) ; 延时500ms @log("计数:", i) ; 输出日志 @calculate(a, b, '+') ; 自定义计算 ``` 自定义函数 ----- 您可以提供自定义函数实现: ```python class MyFunctions: def sleep(self, ms): """延时函数""" import time time.sleep(ms / 1000) def log(self, *args): """日志函数""" print("[LOG]", *args) def calculate(self, a, b, op): """计算函数""" if op == '+': return a + b if op == '-': return a - b if op == '*': return a * b if op == '/': return a / b # 使用自定义函数 processor = PseudoInstructionProcessor(funs_implementation=MyFunctions()) ``` 完整示例 ---- ### example.gcode ```text ; 初始化变量 @var count = 0 @var total = 0 @var positions = [10, 20, 30, 40, 50] $H ; 回零 G90 ; 设置绝对坐标模式 ; 循环处理每个位置 @label loop_start @for pos in positions ; 移动到指定位置 G1 X{pos} Y{pos} Z-10 F1000 ; 计数 @var count = count + 1 @var total = total + pos ; 条件判断 - 记录日志 @if pos > 30 log("大位移:", pos) ; 延时 @sleep(200) @next pos ; 输出结果 @log("总次数:", count) @log("总位移:", total) ; 返回原点 G90 G1 X0 Y0 Z0 F2000 ; 完成 M2 ``` 变量替换语法 ------ 在 G-Code 中使用变量有两种方式: ### 简单变量替换 ```text G1 X@x_pos Y@y_pos M114 X@current_x ``` ### 复杂表达式替换(使用括号) ```text G1 X@(i*2 + offset) Y@(j*3 - 5) M114 X@(pos_x + 10) Y@(pos_y * factor) ``` 错误处理 ---- 程序会详细报告各种错误: * **语法错误**:伪指令格式错误 * **变量错误**:未定义的变量、类型错误 * **循环错误**:for-next 不匹配 * **标签错误**:未定义的标签 * **表达式错误**:Python 表达式计算错误 错误时可以选择继续或中止发送。 命令行参数 -----
参数说明
-p, --port串口号 (例如: COM3, /dev/ttyUSB0)
-b, --baudrate波特率 (默认: 115200)
-v, --verbose显示详细信息
--list-ports列出可用的串口
注意事项 ---- 1. **串口权限**:Linux 下可能需要 `sudo` 或加入 `dialout` 组 2. **伪指令必须独立成行**:以 `@` 开头,不能与 G-Code 混在同一行 3. **变量作用域**:变量在整个文件中有效 4. **安全限制**:`eval` 只允许访问安全的模块(math, time, os, random) 5. **循环嵌套**:支持多层循环嵌套 6. **注释**:支持 `;` 开头的注释 许可证 --- GPLv3