登录
首页 >  Golang >  Go问答

3D打印机串行通信

来源:stackoverflow

时间:2024-04-24 09:27:39 348浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《3D打印机串行通信》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我正在致力于构建一个可以与 golang 中的 3d 打印机通信的工具。我遇到的问题困扰着我,似乎我可以启动与打印机的连接。液晶显示屏发生变化,代码开始运行,但每当我尝试从端口读取数据时,我都得不到任何返回。具体来说,他们应该返回“ok”消息,以便我知道继续下一条消息。此外,当我发送 gcode 字符串时,它似乎永远无法理解它们,据我所知,它们只是被丢弃了。这是我正在使用的示例代码:

package printer

import (
    "errors"
    "fmt"
    "log"
    "strings"
    "time"
    "io/ioutil"
    "path/filepath"

    "github.com/tarm/serial"
)

//printer is a connection to a reprap or similar printer
type printer struct {
    s *serial.port
}

//connect creates the printer struct and returns it after initing it
func connect(port string, speed int64) printer {
    devices, err := getserialdevices()
    if err != nil {
        log.println(err)
    }
    for _, value := range devices {
      log.println("found device: ", value)
    }
    c := &serial.config{name: devices[0], baud: 115200, readtimeout: time.second * 5}
    s, err := serial.openport(c)
    if err != nil {
        log.println("failed to open communication")
        log.fatal(err)
    }

    p := printer{}

    p.s = s

    p.readpump()
    p.readpump()

    return p
}

func (p *printer) readpump() string {
    output := ""
    oldlength := -1
    for {
        buf := make([]byte, 128)
        /*
         this appears to be where part of the problem is,
         i never get anything back from the printer.  per the
         tarm documentation since i'm in non-blocking mode
         i don't capture the error because it's an eof
         */
        n, _:= p.s.read(buf)

        /*if err != nil {
            log.println("failed to readpump")
            log.fatal(err)
        }*/
        output += fmt.sprintf("%s", buf[:n])
        if len(output) == oldlength {
            return output
        }

        oldlength = len(output)

    }
}

//sendcommand sends a single gcode command to the printer
func (p *printer) sendcommand(g string) error {
    g = g + "\n"
    _, err := p.s.write([]byte(g))
    if err != nil {
        log.println("failed to write: ", g)
        log.fatal(err)
    }
    if !strings.hassuffix(p.readpump(), "ok\n") {
        log.println(errors.new("command did not complete successfully"))
    }

    return nil
}

//retrieve the absolute path for serial devices
func getserialdevices() ([]string, error) {
    log.println("getting serial devices")
    devices, err := ioutil.readdir("/dev/serial/by-id")
    if err != nil {
        log.println(err)
        return nil, err
    }
    devicelist := make([]string, len(devices))
    for index, devicelink := range devices {
        //log.println("found device: ", devicelink.name())
        abs, err := filepath.evalsymlinks("/dev/serial/by-id/" + devicelink.name())
        //log.print("absolute device: ")
        //log.println(abs)
        devicelist[index] = abs
        if err != nil {
            log.println(err)
            return nil, err
        }
    }
    return devicelist, nil
}

这是我用来调用打印机的代码:

package main

import (
    "fmt"
    "log"

    "github.com/david-fry/go-3dprinter"
)

func main() {
    fmt.Println("Connecting to Printer...")
    p := printer.Connect("COM3", 115200)

    fmt.Println("Moving Extruder...")
    err := p.SendCommand("G28")
    err = p.SendCommand("G1 Z20")
    err = p.SendCommand("G1 Y100")
    err = p.SendCommand("G1 X100")

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Heating Extruder...")
    err = p.SendCommand("M109 S100")

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Cooling Extruder...")
    err = p.SendCommand("M109 S100")

    if err != nil {
        log.Fatal(err)
    }

}

编辑:这是一个 wanhao duplicator 6。我可以让它与 cura 和 octoprint 一起工作,所以我很确定串行通信可以工作,我只是错过了一些东西。

edit2:更令人费解的是,如果我连接 arduino ide 并将串行波特率设置为 250000,它会向控制台输出垃圾。如果我关闭它并打开 cura,让它检测打印机,然后关闭 cura 并重新打开控制台,它似乎可以正常工作。


解决方案


如果有人在将 golang 连接到 3D 打印机时遇到问题,我终于找到了解决方案。事实证明,go 标准库中系统调用的当前实现不支持非规范波特率。大多数 3D 打印机以 250K 波特率运行,但不支持此速率,因此会失败。使用实现 termios2 规范的包可以允许不寻常的比特率并解决问题。这是我正在使用的当前实现,并且运行良好。

https://github.com/distributed/sers

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《3D打印机串行通信》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>