Проблемы с прямой передачей 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 может печатать вещи в целом, но я хочу иметь возможность делать это вручную.

, 👍2


2 ответа


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

0

Это странно, но у меня есть код отсюда: 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;
}

,

О, чудеса запуска кода, не зная, что он делает! ;), @mac


1

Мое предположение дикое, но, судя по:

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.