Стратегия потоковой передачи большого файла gcode с последовательного порта

Я подключаюсь к принтеру, использующему прошивку Marlin 1.0.3 dev, через пакет Python pyserial.

Я хочу передавать большие файлы 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())

, 👍2

Обсуждение

Пожалуйста, объясните, как это относится к 3D-печати. Отрывок из вашего кода слишком мал, и ваше объяснение вызывает у меня больше вопросов: в чем проблема, каково ваше ожидаемое поведение, где оно приводит к ошибкам?, @Trish

Мне просто нужно придумать стратегию потоковой передачи команд на принтер. Я добавил код просто в качестве примера, но мой вопрос носит более общий характер. Я не думаю, что чтение всего файла и просто отправка его на принтер были бы хорошей идеей. Ни отправка команд по одной, ни ожидание ответа от каждой из них., @fsinisi90

это... похоже на переполнение стека. Я имею в виду программирование интерфейса с 0. обычно мы здесь не программируем интерфейсы, мы просто используем их..., @Trish

Хорошо, я удалю этот вопрос и задам его там. Я думал, что это правильное место. В любом случае, знаете ли вы, как работает буфер принтера или где найти информацию о нем?, @fsinisi90

Сам по себе вопрос в порядке, но нам нужно больше внимания, чтобы ответить на него здесь. Вы могли бы, однако, получить более быструю помощь по SO о программировании, @Trish


1 ответ


Лучший ответ:

3

Ну, после некоторых исследований я нашел кое-что о буферизации в документации RepRap. Я не видел этого раньше.

Работает так:

  1. Вы посылаете команду. Ответ "ок" получен немедленно, это означает, что команда была успешно добавлена в буфер.
  2. Затем вы можете отправить другую команду. Когда буфер заполнится, ответ "ок" будет отложен до тех пор, пока не будет получена новая команда.

Некоторые команды, например M190: Подождите, пока температура на рабочем столе достигнет целевой температуры, приведут к тому, что ответ "ок" будет отложен до тех пор, пока команда не завершит свое выполнение. Это означает, что принтер не будет принимать больше команд в то же время.

Мне все еще нужно проверить, сколько команд примерно может сохранить буфер, и удобно ли его полностью заполнять. Я думаю, что нет, потому что, допустим, вы хотите приостановить печать. Если вы добавили в буфер много команд, вы не сможете приостановить его до тех пор, пока все они не будут завершены.

Эта тема на форуме RepRap также была полезной.


,

Вы выяснили, как определить, сколько в данный момент содержится буфера? Я пытаюсь сделать то же самое, но я не уверен, как это синхронизировать. Спасибо!, @nyxaria