从串行端口流式传输大型 gcode 文件的策略

3D打印 马林鱼
2021-05-15 09:06:41

我正在通过pyserial Python 包连接到使用Marlin 1.0.3 开发固件的打印机

我想将大型 gcode 文件流式传输到打印机中,我猜缓冲区的大小有限。我如何知道缓冲区何时已满,以便我可以等到命令处理完毕后再发送一个新命令?

我试过读取一个大文件,发送所有命令并检查另一个线程中的打印机响应。我没有收到错误或指示缓冲区已满的信息。我也没有在官方文档中找到任何关于此的内容

我的方法对吗?有什么我想念的吗?

部分代码:

def check_for_responses():
    while(True):
        response = printer_connection.serial.readline()
        print(response)


async def stream_gcode():
    await printer_connection.open_connection('COM7')
    Thread(target=check_for_responses).start()
    asyncio.sleep(2) # wait to initialize
    file = open("test.gcode", 'r')
    for line in file:
        command= printer_connection.format_command(line)
        printer_connection.serial.write(command.encode())

asyncio.new_event_loop().run_until_complete(stream_gcode())
1个回答

好吧,经过一些研究,我在 RepRap 文档中找到了一些关于缓冲的内容我之前没有看到。

像这样工作:

  1. 你发送一个命令。立即收到“ok”响应,这意味着该命令已成功添加到缓冲区中。
  2. 然后你可以发送另一个命令。当缓冲区已满时,“ok”响应将被延迟,直到收到新命令。

一些命令,例如M190:等待床温达到目标温度会导致“ok”响应延迟,直到命令执行完毕。这意味着打印机在此期间不会接受更多命令。

我仍然需要检查缓冲区大约可以保存多少命令,以及是否可以方便地完全填充它。我想不会,因为假设您想暂停打印。如果您向缓冲区添加了大量命令,则在所有命令都完成之前您将无法暂停它。

这个线程上的RepRap论坛是也很有用。