注释
我读过的大部分内容都与我的理解一致。 您没有提到有关详细字符串的太多细节。GRBL 将其状态和计算出的位置传回控制器。发送?得到这个回应。它的调用大约每 200 毫秒一次。Candle GUI 试图更快地发送它,但它导致 grbl 崩溃/挂起——我猜信息太多了。他们论坛上有据可查的问题。 对于在微型 8 位 IC 上运行的所有这些代码令人印象深刻,我开始意识到的一个问题是 40k 速度——我刚刚在我的机器上安装了新硬件,但无法让轴移动得更快,现在我意识到为什么。 |
@MeJasonT: 关于串口速度的备注已经包含在原问题中了。 |
我知道 Candle 的默认安装至少存在一个轮询问题,因为我提出了它,将轮询率设置为快速。我也被指向别人帖子的答案 |
我已经编写了一个 Python3 模块,它实现了我在 Grbl v1.1 的驱动程序中的原始帖子中提到的大部分项目。它处理流量控制,从而最大限度地减少命令丢失的变化。该模块不完整,也没有经过严格测试。在我的测试环境中,它运行良好,但我还没有使用过像“$C”这样的命令。请参阅网址https://github.com/wnelis/Grbl-driver-python。 |
作为 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 之间的同步丢失,例如因为从未发送预期的响应,则没有简单的方法来重新获得同步。
很抱歉发了这么长的帖子。我真的很想知道我是否在正确的轨道上。