Стратегия потоковой передачи большого файла 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())
@fsinisi90, 👍2
Обсуждение1 ответ
Лучший ответ:
Ну, после некоторых исследований я нашел кое-что о буферизации в документации RepRap. Я не видел этого раньше.
Работает так:
- Вы посылаете команду. Ответ "ок" получен немедленно, это означает, что команда была успешно добавлена в буфер.
- Затем вы можете отправить другую команду. Когда буфер заполнится, ответ "ок" будет отложен до тех пор, пока не будет получена новая команда.
Некоторые команды, например M190: Подождите, пока температура на рабочем столе достигнет целевой температуры, приведут к тому, что ответ "ок" будет отложен до тех пор, пока команда не завершит свое выполнение. Это означает, что принтер не будет принимать больше команд в то же время.
Мне все еще нужно проверить, сколько команд примерно может сохранить буфер, и удобно ли его полностью заполнять. Я думаю, что нет, потому что, допустим, вы хотите приостановить печать. Если вы добавили в буфер много команд, вы не сможете приостановить его до тех пор, пока все они не будут завершены.
Эта тема на форуме RepRap также была полезной.
Вы выяснили, как определить, сколько в данный момент содержится буфера? Я пытаюсь сделать то же самое, но я не уверен, как это синхронизировать. Спасибо!, @nyxaria
- Повторная калибровка исходного положения
- Как установить границы Z-зонда в прошивке при использовании автоматического выравнивания стола?
- Как увеличить количество точек зондирования для датчика BLTouch в прошивке Marlin?
- Marlin Регулировка скорости подачи
- Как установить смещение Z для дома
- Указание смещения Z в прошивке Marlin
- BLTouch Зондирование Периодически Терпит Неудачу
- Как добавить параметры меню в жидкокристаллическое меню (прошивка Marlin)?
Пожалуйста, объясните, как это относится к 3D-печати. Отрывок из вашего кода слишком мал, и ваше объяснение вызывает у меня больше вопросов: в чем проблема, каково ваше ожидаемое поведение, где оно приводит к ошибкам?, @Trish
Мне просто нужно придумать стратегию потоковой передачи команд на принтер. Я добавил код просто в качестве примера, но мой вопрос носит более общий характер. Я не думаю, что чтение всего файла и просто отправка его на принтер были бы хорошей идеей. Ни отправка команд по одной, ни ожидание ответа от каждой из них., @fsinisi90
это... похоже на переполнение стека. Я имею в виду программирование интерфейса с 0. обычно мы здесь не программируем интерфейсы, мы просто используем их..., @Trish
Хорошо, я удалю этот вопрос и задам его там. Я думал, что это правильное место. В любом случае, знаете ли вы, как работает буфер принтера или где найти информацию о нем?, @fsinisi90
Сам по себе вопрос в порядке, но нам нужно больше внимания, чтобы ответить на него здесь. Вы могли бы, однако, получить более быструю помощь по SO о программировании, @Trish