#gcode #uart #printing #3d #serial #send #action

gcode-serial

Rust 库,通过 UART 向 3D 打印机发送 Gcode

5 个版本

0.1.4 2023 年 10 月 1 日
0.1.3 2023 年 7 月 23 日
0.1.2 2023 年 7 月 15 日
0.1.1 2023 年 7 月 15 日
0.1.0 2023 年 7 月 13 日

#893硬件支持

29 每月下载次数

MIT 许可证

36KB
647

Rust 库,通过 UART 向 3D 打印机发送 Gcode

基于流的 GCode 发送器。API 仍在开发中,可能有所变化。

快速入门代码

use gcode_serial::gcode_serial::GcodeSerial;
use gcode_serial::models::action::{Action, Command, PrinterStatus, TelemetryData};
use gcode_serial::models::serial_connector::SerialConnector;

use tokio::sync::broadcast;
use tokio::runtime::Runtime;

fn main() {
    // initialize Tokio runtime
    let t = Runtime::new().unwrap();

    let filename = "test.gcode";

    t.block_on(async move {
        let (tx, _) = broadcast::channel(32);

        let t = tx.clone();
        tokio::spawn(async move {
            // create printer object
            let mut gs = GcodeSerial::new(t);
            // start printer service
            gs.start(SerialConnector::Auto).await;
        });

        // send print start command
        tx.send(Action::Command(Command::StartPrint(filename)));

        let mut rx = tx.subscribe();
        // monitor for receiving actions
        loop {
            if let Ok(v) = rx.recv().await {
                match v {
                    Action::Telemetry(t) => {
                        match t {
                            TelemetryData::Temps(v) => {
                                println!("Extruder temp: {}; Bed temp: {}", v.ex_temp, v.bed_temp);
                            }
                            TelemetryData::Progress(x) => {
                                println!("Number of commands left in que: {}", x);
                            }
                            TelemetryData::TargetExtruderTemp(t) => {
                                println!("Target Extruder Temp change: {}", t);
                            }
                            TelemetryData::TargetBedTemp(t) => {
                                println!("Target Extruder Temp change: {}", t);
                            }
                            TelemetryData::TotalCommandCount(n) => {
                                println!("Number of total commands to send: {}", n);
                            }
                            TelemetryData::ActiveFile(f) => {
                                println!("Current file changed: {}", f.unwrap().name);
                            }
                            _ => {}
                        }
                    }
                    Action::StateChange(_) => {}
                    Action::PrinterAction(_) => {}
                    Action::Command(_) => {}
                }
            }
        }
    })
}

用法

GcodeSerial 对象

首先,您需要为每个要连接的打印机创建一个 GcodeSerial 实例 let mut gs = GcodeSerial::new(t),其中 t 是与库通信所需的广播通道。

之后,您可以使用 gs.start(SerialConnector::Auto).await; 连接到打印机。您可能希望在一个单独的(软)线程中调用此操作,因为此调用是阻塞的。

SerialConnector

您可以选择使用 SerialConnector::Auto 自动查找串行端口,或者使用 SerialConnector::Manual("/dev/ttyUSB0", 115_200) 手动查找。

从/向打印机接收/发送数据

连接到广播流并使用 Enum 接收所需的数据。请参见上面的示例。

Enum 字段 功能 示例 触发
Action::Telemetry(t) 接收遥测数据 温度、进度、目标温度、风扇速度 值更改
Action::StateChange(t) 打印机状态改变 断开连接、活动、空闲、出错 值更改
Action::PrinterAction(t) 打印机发送动作命令 取消/暂停/恢复打印 打印机
Action::Command(t) 向库发送动作 开始/取消打印、设置温度 库用户

许可证

MIT 许可证

版权所有 © 2023 Lukas Heiligenbrunner

特此授予任何人免费获得本软件及其相关文档文件(“软件”)的副本的权利,无需限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供者提供此类权利的人这样做,但受以下条件限制:

上述版权声明和本许可声明应包含在软件的所有副本或实质部分中。

软件按“原样”提供,不提供任何形式(明示或暗示)的保证,包括但不限于适销性、适用于特定目的和不侵犯版权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权或其他原因,并源于、因之或与软件或软件的使用或其他方式有关。

依赖关系

~7-10MB
~188K SLoC