Проблемы с прямой передачей g-кода через последовательный порт
Модель принтера неизвестна, получил его как подарок, вероятно, что-то общее декартово на arduino mega и ramps платах, сшитых вместе и с прошивкой marlin.
Я использовал принятый ответ отсюда, чтобы попытаться переместить эту вещь из терминала. Как напрямую отправить G-код на принтер с терминала Linux?
Моя первая попытка получить доступ к низкоуровневому интерфейсу принтера выглядела так:
./baud.py <> /dev/ttyACM0 250000
tail -f /dev/ttyACM0 &
cat > /dev/ttyACM0
Сначала все было нормально: я ввел g-код, принтер выполнил его и вернул сообщение ok в мой терминал.
Затем я выключил и снова включил принтер и повторил весь процесс, но теперь tail-f
ничего не выводил, а ЖК-дисплей принтера отображал мусор в строке состояния после выполнения команды.
Я также заметил, что контроллер принтера перезагружается каждый раз при доступе к последовательному порту, но не уверен, что это произошло в первый раз, когда все работало хорошо.
Вывод cat /dev/ttyACM0
после настройки бода тоже немного странный - и в строке состояния вместо стандартного "%printername% ready" тоже есть мусор:
start
echo:Marlin1.0.0
echo: Last Updated: May 20 2017 18:12:04 | Author: (none, default config)
Compiled: May 20 2017
echo: Free Memory: 3763 PlannerBufferBytes: 1232
echo:Hardcoded Default Settings Loaded
echo:Steps per unit:
echo: M92 X80.00 Y80.00 Z3200.00 E97.94
echo:Maximum feedrates (mm/s):
echo: M203 X50.00 Y50.00 Z2.50 E25.00
echo:Maximum Acceleration (mm/s2):
echo: M201 X750 Y750 Z100 E10000
echo:Acceleration: S=acceleration, T=retract acceleration
echo: M204 S500.00 T500.00
echo:Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s)
echo: M205 S0.00 T0.00 B20000 X20.00 Z1.00 E5.00
echo:Home offset (mm):
echo: M206 X0.00 Y0.00 Z0.00
echo:PID settings:
echo: M301 P22.20 I1.08 D114.00
echo:SD init fail
echo:Unknown command: "starto"
ok
echo:Unknown command: "SD init failstartuthor"
ok
echo:Unknown command: " (none, default config)50.00 Z2.50 E2rBy00.00 Y0.00 Z0.00echo"
ok
echo:Unknown command: "Unknown command"
ok
echo:Unknown command: " "starto"own comm"
ok
echo:Unknown command: "aximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s)echo"
ok
echo:Unknown command: "PID settings"
ok
echo:Unknown command: "okechecho"
ok
Строка "SD init fail" и все, что после нее появляется, когда данные датчика появляются на ЖК-дисплее, перед этим возникает задержка, в течение которой ЖК-дисплей пуст.
Если вы отправляете команды на принтер, используя что - то вроде echo "G0 X10" > /dev/ttyACM0
, он выполняет их только при следующем доступе к последовательному порту (и, следовательно, перезагрузке) - или не выполняет вообще.
Интересно то, что вкладка "Монитор" Cura действительно может манипулировать кареткой, и сама Cura может печатать вещи в целом, но я хочу иметь возможность делать это вручную.
@Karashevich B., 👍2
2 ответа
Лучший ответ:
Это странно, но у меня есть код отсюда: https://stackoverflow.com/questions/6947413/how-to-open-read-and-write-from-serial-port-in-c немного изменил его, удалил несколько строк, запустил - и мой порт начал работать просто отлично. Вот полный код (для Linux, конечно).
Я думаю, что это была строка c_lflag, которая решила проблему.
#include <asm/termios.h>
#include <stropts.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int set_interface_attribs (int fd) {
struct termios2 tty;
memset (&tty, 0, sizeof tty);
ioctl(fd, TCGETS2, &tty);
tty.c_cflag&=~CBAUD;
tty.c_cflag|=BOTHER;
tty.c_ispeed=tty.c_ospeed=250000;
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
tty.c_iflag &= ~IGNBRK;
tty.c_lflag = 0;
tty.c_oflag = 0;
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 5;
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
tty.c_cflag |= (CLOCAL | CREAD);
tty.c_cflag &= ~(PARENB | PARODD);
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CRTSCTS;
ioctl(fd, TCSETS2, &tty);
return 0;
}
int main() {
int fd=open("/dev/ttyACM0",O_RDWR|O_NOCTTY|O_SYNC);
set_interface_attribs(fd);
close(fd);
return 0;
}
Мое предположение дикое, но, судя по:
echo:Unknown command: "starto"
ok
echo:Unknown command: "SD init failstartuthor"
ok
echo:Unknown command: " (none, default config)50.00 Z2.50 E2rBy00.00 Y0.00 Z0.00echo"
ok
echo:Unknown command: "Unknown command"
ok
echo:Unknown command: " "starto"own comm"
ok
echo:Unknown command: "aximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s)echo"
ok
echo:Unknown command: "PID settings"
ok
Похоже, вы можете зацикливать выходные данные вашего принтера в качестве входных данных для самогосебя. Я очень подозрительно отношусь к вашей строке: tail-f /dev/ttyACM0&
, поскольку это указывает на то, что вы пытаетесь выполнить другие действия в том же окне терминала после того, как вы начали контролировать последовательное соединение.
Если это так, вы должны окончательно открыть монитор в отдельном терминале (tail-f /dev/ttyACM0
) и передать вход в другой терминал (обратите внимание, что вы не должны использовать final &
).
Наконец, вы, вероятно, хотите использовать cat >> /dev/ttyACM0
вместо cat > /dev/ttyACM0
, поскольку хотите добавить свои команды без усечения существующего потока.
Это не вывод " tail-f /dev/ttyACM0&", это вывод "cat /dev/ttyACM0". И это было во вновь открывшемся окне терминала, даже бодрейт был установлен в другом., @Karashevich B.
@KarashevichB. либо вы меня неправильно поняли, либо думаете, что команды делают что - то другое, чем то, что они делают. :) tail-f fname
будет **выводить** последние биты "fname" и продолжать выводить строки, когда они будут добавлены к нему. cat > fname
будет использовать все, что вы введете или получите в качестве входных данных на активной консоли, как **input** для "fname". Обратите внимание, что это _very_ отличается от cat fname
!!, @mac
Как вы можете видеть из `echo:Unknown command: "Unknown command"", ваш принтер, похоже, получил свой собственный ответ "Unknown command" как саму команду в какой-то момент., @mac
Кроме того, если вы запускаете команду "tail" в своей собственной консоли, вы не хотите использовать последнее " & "и хотите использовать" > > "вместо" > " (см. Мою последнюю правку)., @mac
Как скажешь. На самом деле проблема была совсем в другом-что-то с неправильными параметрами последовательного порта по умолчанию. Запуск set_interface_attribs из принятого ответа отсюда https://stackoverflow.com/questions/6947413/how-to-open-read-and-write-from-serial-port-in-c на моем порту проблема как-то решалась. Не знаю, как мне удалось заставить порт работать в первый раз, но ладно., @Karashevich B.
- В чем разница между M420 S и M420 S1?
- M502 сбросит все настраиваемые настройки к их "заводским настройкам по умолчанию", какие это настройки?
- Как установить размер буфера G-кода на Marlin?
- Что такое команда M73 Q17 S43 G-code?
- Решение Cura заменить углы->дуги для увеличения угловой скорости?
- Marlin - замедление скорости печати
- Как установить смещение Z?
- Что определяет скорость, с которой двигатель втягивается, и как ее можно изменить?
О, чудеса запуска кода, не зная, что он делает! ;), @mac