如何从 Linux 终端直接将 G 代码发送到打印机?

3D打印 固件 arduino-mega-2650
2021-04-24 11:16:52

Linux下是否可以使用管道将G代码直接发送到打印机串行连接?

例子:

echo M106 > /dev/ttyUSB0

我的控制器以 250000 波特运行,我尝试将 TTY 波特率设置为 250 kBd:

stty -F /dev/ttyUSB0 250000

但是,不幸的是,这个特殊的波特率在 Ubuntu 下似乎不受支持,给出了错误:

stty: invalid argument ‘250000’
4个回答

对于从终端直接低级打印机控制,无需特定软件,我找到了以下解决方案,感谢用户:http : //stackexchange.com/users/6463673/meuh

在这里分享可能对 3d 打印社区中的其他用户有用,我无法在其他地方找到“完整”的解决方案。


步骤 1) 创建一个自定义的 python 脚本,允许您设置任意波特率(使用 使可执行文件chmod u+x)。

#!/usr/bin/python
# set nonstandard baudrate. Original Question: http://unix.stackexchange.com/a/327366/119298
import sys,array,fcntl

# from /usr/lib/python2.7/site-packages/serial/serialposix.py
# /usr/include/asm-generic/termbits.h for struct termios2
#  [2]c_cflag [9]c_ispeed [10]c_ospeed
def set_special_baudrate(fd, baudrate):
    TCGETS2 = 0x802C542A
    TCSETS2 = 0x402C542B
    BOTHER = 0o010000
    CBAUD = 0o010017
    buf = array.array('i', [0] * 64) # is 44 really
    fcntl.ioctl(fd, TCGETS2, buf)
    buf[2] &= ~CBAUD
    buf[2] |= BOTHER
    buf[9] = buf[10] = baudrate
    assert(fcntl.ioctl(fd, TCSETS2, buf)==0)
    fcntl.ioctl(fd, TCGETS2, buf)
    if buf[9]!=baudrate or buf[10]!=baudrate:
        print("failed. speed is %d %d" % (buf[9],buf[10]))
        sys.exit(1)

set_special_baudrate(0, int(sys.argv[1]))

步骤 2) 运行脚本以设置您的波特率。
./set_custom_baud_rate.py <> /dev/ttyUSB0 250000


步骤 3) 您现在可以通过以下命令在终端窗口中监控打印机输出:
tail -f /dev/ttyUSB0


步骤 4) 最后,打开一个新的终端窗口,您可以直接将 M 或 Gcode 发送到您的打印机;例子:
echo "M115" >> /dev/ttyUSB0

你可以使用屏幕。打开一个终端窗口并输入 screen /dev/ttyUSB0 115200一般形式是 screen serialdevice baudrate您将看到打印机发送的所有内容。您键入的所有内容都将发送到打印机。

我花了几个小时试图弄清楚为什么我的 Creality Ender Pro 在我从 Python 应用程序通过 USB 发送串行数据时忽略了我。谷歌搜索试图找到那些没有谈论一个解决方案encode(),并decode()似乎都使我这个线程。

我按照视频链接安装了 Minicom,并且一切正常,但是我仍然没有在我的 Python 实现中收到回复,我可以连接并读取从打印机发送的串行,但在发送回时没有附加任何内容。

经过几个小时的挠头,我意识到打印机对输入做出反应,因为它收到\n了我未能添加到发送的每个命令末尾的每个新行字符,因此打印机只是坐等我完成传输我的行尾从来没有来过。

self.serialPort = serial.Serial('/dev/ttyUSB0', 115200, exclusive = True)
lines = self.serialPort.read(self.serialPort.in_waiting).decode().splitlines(False)
line = line + "\n"
self.serialPort.write(line.encode())

希望没有其他人像我一样愚蠢,但为了节省像我这样的其他人的时间,我想在这里指出这一点。

接受的答案对我不起作用。串行端口上接收到的所有内容都被重复返回串行端口,使打印机陷入混乱的循环。在这个答案中有更多信息:https : //unix.stackexchange.com/questions/42964/unexpected-results-testing-serial-loopback-using-echo-and-cat

关键是使用这样的命令来防止某些行终止字符重复自己:stty 115200 -F /dev/ttyUSB0 -echo -onlcr ,其中 115200 是您的波特率。

这是我所做的:

# 1. plug in printer
sudo chmod +777 /dev/ttyUSB0 # 2. allow access to printer USB permissions, add user to dialout or tty is better
stty 115200 -F /dev/ttyUSB0 -echo -onlcr # 3. set serial port baud rate, might be 250000 for you
cat -v < /dev/ttyUSB0 # 4. get printer output 

然后在一个新终端中:

   echo "M119" >> /dev/ttyUSB0

这会给你一个真正的控制台。