开源改变世界!!

有关与 Grbl 1.1 通信的详细信息 #822

推推 grbl 2年前 (2023-01-23) 319次浏览

打开
wnelis 打开了这个问题 2020 年 3 月 1 日 · 4条评论
打开

有关与 Grbl 1.1 通信的详细信息#822

wnelis 打开了这个问题 2020 年 3 月 1 日 · 4条评论

注释

有关与 Grbl 1.1 通信的详细信息 #822
wnelis 评论了 2020 年 3 月 1 日  

作为 Grbl 的新手,我试图了解与 Grbl 通信的详细信息。需要这些细节,因为计划是编写我自己的驱动程序(可能是非 GUI)。Grbl v1.1 在我的案例中是在 Arduino Nano 上实现的。
下面是我现在理解的通信规范列表,部分记录在 Grbl 的 github 站点上,部分是通过谷歌搜索找到的,部分只是我的最佳猜测。

对正确性和完整性的任何评论表示赞赏。

  • 通信采用异步串行传输,115200 波特,无奇偶校验,8 个数据位和 1 个停止位(115200N81)。无法设置其他速度。[编辑:改变速度的唯一方法是在文件 config.h 中改变它,重新编译 Grbl 并将其加载到 Arduino 中。]

  • 通信是全双工的。

  • 通信使用 ASCII 的扩展形式,其中每个符号可以用一个字节(八位字节)表示。

  • 通信的基本单位是线路。一行由行尾符号分隔,当发送到 Grbl 时是 ASCII 符号 CarriageReturn,当从 Grbl 接收时是 ASCII 符号 CarriageReturn 加 LineFeed。行尾符号不被视为行的一部分。

  • Grbl 的数据流由三种类型的消息混合组成,即 g 代码块、系统命令和实时控制命令。[编辑:G 代码块和系统命令按行发送。]

  • 一个 g 代码块由零个或多个 g 代码组成。g代码记录在不同的地方。精确的语法和含义不在本列表的范围内。

  • 空行被认为是其中包含零个 g 代码的 g 代码块。结果,发送空行的响应总是“ok”,因此永远不会出现错误消息。

  • 每个 g 代码块都会产生一个响应,要么是“确定”,要么是一条错误消息。描述(识别)错误消息的正则表达式是 ‘^error:\d+$’(单引号不是正则表达式的一部分)。因此,可以使用正则表达式“^(?:ok|error:\d+)$”识别响应。

  • 一行的最大长度为 80 个符号,不包括 g 代码块中的注释部分。

  • 系统命令在行的开头都有一个“$”符号。

  • 一行包含一个系统命令,而一行最多包含一个系统命令。

  • 实时控制命令由单个符号组成,因此不受行尾符号分隔。

  • 可以(几乎)随时发送实时控制命令。如果 Grbl 正在处理另一个实时控制命令或正在进行(软)重置,则不能发送它。

  • 只有实时控制命令’^X’(0x18,软复位)和’?’ (查询状态)给予回应。第一个生成欢迎消息,第二个生成由 V 形分隔的一行。因此,可以使用正则表达式“^<.+>$”识别状态查询的响应。

  • 其他实时控制命令不作响应。尽管如此,如果发送了多个命令,第二个和后面的命令将(可能)被忽略,直到它执行完第一个接收到的命令。因此,出于流量控制的目的,两个连续的实时命令之间没有响应的时间至少应为 25 [ms]。

  • 应识别所有响应,以检测推送消息。这些不是查询的(直接)结果,而是由 Grbl 推送的。推送消息不是流协议(流量控制方法)的一部分。

  • 有两种流量控制方法,称为发送响应(fc-sr)和字符计数(fc-cc)。

  • 这两种方法仅适用于流协议,因此仅适用于 g 代码块和系统命令。

  • 在 fc-sr 的情况下,在收到前一行的响应(带有系统命令的 g 代码块)之前,不会发送 g 代码块或系统命令。因此它是一种传输窗口大小为一个(行)的流量控制方法。

  • 在 fc-cc 的情况下,如果 Grbl 的接收缓冲区中有足够的空间来容纳完整的行,包括行尾符号,则发送带有 g 代码块或系统命令的行。收到响应后,导致响应的行使用的缓冲区空间可以免费用于下一行。

  • 如果该行导致写入 EEPROM,则不能使用 fc-cc。在发送线路之前,发件人应该切换到 fc-sr。发送方收到线路的响应,表明EEPROM修改完成,可以切换回fc-cc。

  • 如果命令与以下正则表达式之一匹配,则它(可能)会修改 EEPROM:’^$RST=.*$’、’^G10 L20? P\d+$’、’^G28.1’、’^G30.1’、’^$\d+=.+$’、’^$I’ 和 ‘^$N[01]=.+$’。

  • 在进行重置时,无法向 Grbl 发送任何内容。收到欢迎消息后,可以将线路发送到 Grbl。

  • 在发送终止检查模式的系统命令“$C”后,必须停止通信,直到收到欢迎消息。

  • 如果 sender en Grbl 之间的同步丢失,例如因为从未发送预期的响应,则没有简单的方法来重新获得同步。

很抱歉发了这么长的帖子。我真的很想知道我是否在正确的轨道上。

有关与 Grbl 1.1 通信的详细信息 #822
我杰森T 评论了 2020 年 3 月 2 日  

我读过的大部分内容都与我的理解一致。
据我所知,同步方法是将行字符按 fifo(先进先出)的方式插入缓冲区,grbl 解析和响应一行的响应是发送“ok”
波特率可以是任何速率——它在 config.ini 中设置。我的等离子表使用 9600 波特,因为这是我的光纤收发器可以运行的最快速度。使用标准 USB/串行通信对等离子高频噪声有问题。已经有几个翻译器已经编写并在 git 上可用 Grbl Panel 就是这样一个 GUI,它将翻译器编写为应用程序中的子例程。很遗憾您不打算编写 GUI,因为我最感兴趣的是它 – 理想情况下,我希望我的 grbl 机器在类似于 Tormach 的 pathpilot 的 GUI 上运行。
不是 Mach3/4 采用的游戏学校和卡通图形。
将整个机器切换到 linux,我发现 anally retention。他们可能是优秀的程序员,但对硬件知之甚少——这是一场持续不断的斗争。
我可能帮不上什么忙,但我当然对您的项目及其进展情况很感兴趣。

您没有提到有关详细字符串的太多细节。GRBL 将其状态和计算出的位置传回控制器。发送?得到这个回应。它的调用大约每 200 毫秒一次。Candle GUI 试图更快地发送它,但它导致 grbl 崩溃/挂起——我猜信息太多了。他们论坛上有据可查的问题。

对于在微型 8 位 IC 上运行的所有这些代码令人印象深刻,我开始意识到的一个问题是 40k 速度——我刚刚在我的机器上安装了新硬件,但无法让轴移动得更快,现在我意识到为什么。

有关与 Grbl 1.1 通信的详细信息 #822
作者

@MeJasonT: 关于串口速度的备注已经包含在原问题中了。
我查看了https://github.com/Denvi/Candle,但只发现了一个关于轮询频率的问题:25 [Hz] 太高,5 [Hz] 就足够了。没有提到 Grbl 的问题。

有关与 Grbl 1.1 通信的详细信息 #822

我知道 Candle 的默认安装至少存在一个轮询问题,因为我提出了它,将轮询率设置为快速。我也被指向别人帖子的答案

有关与 Grbl 1.1 通信的详细信息 #822
作者

我已经编写了一个 Python3 模块,它实现了我在 Grbl v1.1 的驱动程序中的原始帖子中提到的大部分项目。它处理流量控制,从而最大限度地减少命令丢失的变化。该模块不完整,也没有经过严格测试。在我的测试环境中,它运行良好,但我还没有使用过像“$C”这样的命令。请参阅网址https://github.com/wnelis/Grbl-driver-python

喜欢 (0)