评论
// https://github.com/cncjs/cncjs/blob/master/src/app/controllers/Grbl/GrblController.js#L112
this.sender = new Sender(SP_TYPE_CHAR_COUNTING, {
// Consider periodic commands ('$G\n', '?') to make sure the buffer doesn't overflow
bufferSize: (128 - 4) // The default buffer size is 128 bytes
});
Grbl 默认有 128 字节的缓冲空间。我从缓冲区大小中扣除了 4 个字节以排除周期性命令(即 len(‘$G\n’) + len(‘?’) = 4),但我担心这可能不够安全以防止缓冲区溢出. 你能提供我以下资料吗?谢谢。
|
|
是的,我忘记了你提到的行(GrblController.js 第 156 行),你必须在编辑 index.js 文件时更新该行。这是为了支持 GRBL-Mega,它的缓冲区空间为 255 字节,请参见#115。 我同意你的建议,发送者队列、馈线队列和周期性命令应该使用优先级队列组合成一个,以防止竞争条件。我可能会在不久的将来尝试重构这部分。 |
|
我猜想这可能是由于在发送 gcode 期间动态更改缓冲区大小引起的: // Detect the buffer size if Grbl is set to report the rx buffer (#115)
if (res && res.buf && res.buf.rx) {
const rx = Number(res.buf.rx) || 0;
// Deduct the length of periodic commands ('$G\n', '?') to prevent from buffer overrun
const bufferSize = (rx - 8);
if (bufferSize > this.sender.sp.bufferSize) {
this.sender.sp.bufferSize = bufferSize;
}
}
它应该像下面这样更正。 // Update buffer size only when the workflow state is idle
if (this.workflowState === WORKFLOW_STATE_IDLE && res && res.buf && res.buf.rx) {
: : :
}
更新: |
|
我将在今天晚些时候为 1.8.x 版本和 1.9.x 预发布版本提供热修复更新。 |
|
您可以查看 1.8.17 以获取新的更新。 |
|
我现在正在安装 v1.8.17 进行测试。我仍然认为删除状态更新命令上的计时器并将它们嵌入到队列逻辑中有一些好处。我对如何实现这一点有一些想法,我将尝试对我的本地副本进行一些测试,看看我是否可以处理它。我使用 JavaScript 的经验让我对计时器非常谨慎。JavaScript 有一个非常不可预测的线程模型。 var elapsedStatusDelta = now – lastStatusRequest; 我可能会在这方面走得更远,所以如果我有任何成功,我会告诉你。 |
|
我打算切换到 v1.9.0-alpha.3 版本,因为它有很多很好的修复,将使测试更容易。 |
|
您介意粘贴您的 gcode 文件和 Grbl 设置吗?这将有助于从我这边找出问题。 |
|
这是我当前的 Grbl 设置。我无法发布我正在测试的 gcode,我将尝试制作一个非专有的类似代码,看看我是否可以重现该问题。 |
|
好的,谢谢你对我的耐心。我认为这里还有一些其他问题实际上使状态循环看起来像是罪魁祸首,但实际上,这似乎是串行端口通信的问题。我现在正在运行 1.9.0-alpha.3。我正在闲置地观察日志中的状态更新,它们运行平稳,直到我突然在控制台中看到“错误:2”。此时,状态更新停止。我发一个?来自控制台小部件的命令,它是成功的,然后状态更新统计再次在日志中流动,直到另一个随机“错误:2”发生并停止一切。 |
|
我将节点升级到 v6.9.5,删除了 cncjs,并重新安装了 alpha.3。我收到了关于构建 4.0.7 的类似串口警告,因为 6.9.5 没有受支持的二进制文件。构建期间还有很多其他警告。 Arduino 固件和 USB 到串行通信似乎存在“已知问题”。我不记得通用 GCode 发送器有这个问题,但也许它正在解决它。 稍后我会尝试刷新 Arduino,看看是否能解决问题。 |
|
我通过 Universal GCode Sender 运行了同样的工作,但我没有看到所有错误:2 和错误:25 问题,但我确实偶尔看到错误:1 响应(我认为我之前没有仔细看过)。我认为这证实至少部分问题与我的 Arduino Atmel 固件版本有关。 |
|
您可以尝试将串口升级到“5.0.0-beta3”吗? 如果您可以在您的环境中进行构建,只需替换 package.json 中的行并重新安装:
安装依赖项并创建生产版本:
|





我对此不是 100% 确定,但我一直在解决我的 gcode 文件被错误地发送到 GRBL 的问题。我收到关于遗漏单词和错误数字格式的奇怪回复,这让我相信缓冲区溢出了。
我今天四处闲逛,试图了解发生了什么,我能说的最好的是,问题出在发送者队列之外的定时器上发送的定期状态查询,直接写入串行端口。我正在查看 GrblContoller.js 的第 319 和 324 行。我不认为,按照它的编写方式,这些命令被计入缓冲区计数。我认为最好将它们注入发送者队列并允许缓冲区计数器包含这些字节以防止缓冲区溢出。
考虑了几分钟后,我认为也许状态查询应该作为文件解析器的一部分定期注入到发送者队列中。这将消除竞争条件和假设的缓冲区溢出。或者可能每次发送方队列 while 循环进入一次,这样它就不会被许多非常小的命令调用得太频繁。