Nomar记录一段历史
如何从 Linux 终端直接将 G 代码发送到打印机?

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

示例:

 echo M106 > /dev/ttyUSB0

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

 stty -F /dev/ttyUSB0 250000

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

 stty: invalid argument '250000'

6个回答

这个论坛页面强烈建议您应该将setserial用于端口,而不是stty ,后者用于终端。我会尝试一下那里的代码片段。或者, stackoverflow也有类似的讨论,但有一些更复杂的修改。

您确定不能以低于打印机端最大能力的波特率与打印机通话吗?

我相信你不能在不重新编译固件的情况下降低 Marlin 的波特率。
@TomvanderZanden 无赖:-(

对于从终端直接低级打印机控制,无需特定软件,我找到了以下解决方案,感谢用户: 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

我可以问你这个脚本怎么可能工作?我不明白你为什么使用``<>``,起初我以为是一个错字,但是修改脚本并直接打开串口并不会修改其波特率。
``<>`` 在 unix 上打开文件读+写模式,不截断,如果文件不存在则创建文件。即系统调用:``open(filename, O_RDWR|O_CREAT)``
例如,``cat < foo.txt`` 它将打印 foo.txt 的内容,如果 foo.txt 不存在则失败。而``cat <> foo.txt``,如果存在,也会打印内容,但如果它不存在,则会创建文件。
我知道``<>`` 的作用,但我不明白为什么这适用于波特率:您正在设置文件描述符 ``0`` 的波特率,即 ``stdin`` 不适用于串行端口.
我的理解是波特率只是脚本的第一个参数,(即“sys.argv[1]”)。如果您要修改脚本并对波特率进行硬编码,和/或使用 python equiv 打开设备。 ``open(filename, O_RDWR|O_CREAT)`` 之后,如果这不起作用,我也会感到惊讶。
@gipi "<> /dev/ttyUSB0" 参数定义了脚本的标准输入和标准输出。脚本在stdin上运行时,是在/dev/ttyUSB0上运行。
这对我不起作用,也对这个人不起作用:https://3dprinting.stackexchange.com/questions/10612/sending-g-code-through-usb-serial-doesnt-work-ender-3?noredirect=1&lq= 1 tail 命令不输出任何东西打印机似乎认为“ok”是一个未知命令,这是它的响应,对吗?那么为什么它会接收自己的响应作为命令呢?

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

谢谢!虽然这适用于非标准波特率,例如 250k?我怀疑不是(至少对于 Ubuntu/Mint),但是可以根据您的建议将上述脚本与 ``screen`` 命令结合起来。

这是工作解决方案:

您需要 2 个终端,一个用于输入,另一个用于输出
来自 [help]:**为链接提供上下文** 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的用户同事了解它是什么以及它为什么在那里。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。 *如果没有视频,如果链接失效,这个答案对未来没有价值,请描述视频海报如何从 Ubuntu 访问打印机,这将是一个很好的答案!*

我花了几个小时试图弄清楚为什么我的 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())

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

这是对其他答案的一种“我也是”答案。你指的是哪个链接?这个答案最好作为对该答案的评论发布。
我试图移动它,但它说“你必须有 50 个代表才能发表评论”
请缩短答案并在评论中指出您要回复的答案,版主可以为您移动。

接受的答案对我不起作用。串行端口上接收到的所有内容都被重复返回串行端口,使打印机陷入混乱的循环。在这个答案中有更多信息: 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

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

但是接受的答案在 250000 上对我也不起作用
你能分享一下你在 linux 上使用的那个失败的风格和版本吗? (它适用于主流发行版 - Ubuntu 和 Mint - 在发布时。也许我们可以找出为什么它对您不成功。我注意到您的解决方案适用于波特率 115200,您能否验证这适用于波特率 250000 ?
接受的答案在 250000 上使用 `cat -v < /dev/ttyUSB0` 而不是 `tail -f /dev/ttyUSB` 时有效
可以确认之前的答案适用于 Ubuntu 18.04 和之前的 IIRC Mint(版本未知,已格式化)。不知道为什么它在 16.04 上失败了。谢谢你发布另一个对你和其他人有用的答案 - 有多个有效的答案来帮助尽可能多的人总是很棒,干杯!
实际上它仍然在 250000 上重复。所以为了让 stty 停止重复,似乎需要 115200
250000 是非标准波特率。就我而言,115200 可以使用标准 linux 工具找到 - 但为了让 250000 工作,我需要在我的答案中发布该脚本。在我的机器上,250000 可以使用该脚本。

随机文章