开源改变世界

错误:2 – 缺少预期的 G 代码字值或数值格式无效。 #31

推推 grbl 3年前 (2023-02-08) 367次浏览
打开
Tiktiki 打开了这个问题 2022 年 1 月 10 日 · 36条评论
打开

错误:2 – 缺少预期的 G 代码字值或数值格式无效。#31

Tiktiki 打开了这个问题 2022 年 1 月 10 日 · 36条评论

评论

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

我在代码中随机得到这个错误。

目前通过 USB 流式传输,我必须使用 SDCard 进行测试,看它是否与 USB 相关。

循环随机发生,并不总是在同一个地方。

上次错误发生在这里,在剪辑的中间:

5179 好的 N51720 X114.298 Z-4.961
5180 好的 N51730 X114.458 Z-5.323
5181 好的 N51740 X114.571 Z-5.649
5182 好的 N51750 X114.663 Z-6.015
5183 好的 N51760 X114.719 Z-6.398
5184 错误:2 N51770 X114.736 Z-6.754
5185 N51780 X114.635 Y31.872 Z-6.847
5186 N51790 X114.615 Z-6.452
5187 N51800 X114.58 Z-6.201
5188 N51810 X114.51 Z-5.877
5189 N51820 X114.406 Z-5.535
5190 N51830 X114.35 Z-5.388
错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

请从$I输出中获取版本。另外,您正在使用哪个版本的 Teensyduino 进行编译,1.54 之前的版本存在错误。

有两个 USB 选项 – PRJC 或 Arduino 库代码,两者的行为是否相同?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
作者

本周编译了固件,很可能是最新的。

我正在使用 VS Code,但现在不在电脑前。我不确定它默认使用什么驱动程序。我会想到 Arduino,因为我没有安装单独的驱动程序。

稍后将检查所有这些。

它也可能达到硬件的最大块进程限制。我以 84ipm 的速度进行切割,但没有检查我为平滑设置的公差,它可能进给太多了。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
作者

是否有调试/详细模式可以准确回复收到的错误信息?会帮助弄清楚会发生什么…

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

如果您有 UART <> USB 分线,您可以通过取消注释此行来将调试消息发送到 UART 端口。然后可以使用debug_write()发送消息。

如果您想发送已收到的内容,您可以在此处致电

debug_write(line);
debug_write(ASCII_EOL);
错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

你的硬件设置是什么?哪个板?你在使用 VFD 吗?

我也在处理新机器构建中的这个问题。当我们过去在以前的构建(连接到 VFD)上遇到这样的数据错误时,可以通过使用 USB 隔离器来缓解并通过切换到以太网来解决——这两种方法目前都没有安装在我等待交付的新机器上的某些部分。所以我目前将其归咎于 VFD 的 EMI。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
作者

如果您有 UART <> USB 分线,您可以通过取消注释此行来将调试消息发送到 UART 端口。然后可以使用debug_write()发送消息。

如果您想发送已收到的内容,您可以在此处致电

debug_write(line);
debug_write(ASCII_EOL);

实际上,您可以在 config.h 中取消注释一行,它会将所有内容回显到控制台。
似乎我没有在我拥有的固件中启用 SD,并且在用所有东西(SD/FTP/WebUI)刷新它之后,它不再导致问题,无论是 SD 还是 USB。

我也怀疑干扰,但因为我不能再重现它了……

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
作者

你的硬件设置是什么?哪个板?你在使用 VFD 吗?

我也在处理新机器构建中的这个问题。当我们过去在以前的构建(连接到 VFD)上遇到这样的数据错误时,可以通过使用 USB 隔离器来缓解并通过切换到以太网来解决——这两种方法目前都没有安装在我等待交付的新机器上的某些部分。所以我目前将其归咎于 VFD 的 EMI。

现在,Makita 路由器到处都是屏蔽电缆(USB 除外,我现在没有足够长的屏蔽电缆)。
伺服步进器(编码器位置/混合)NEMA24

即使我不使用 VFD,Makita 路由器也有电子变速(基本上是便宜的 VFD)所以它可能很吵。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
作者

我还怀疑缓冲区溢出…我正在发布 3d 流线工具路径并忘记降低分辨率…它被分割为 0.0004″…我的机器可以机械地完成,但它可能太多了100ipm 的 Teensy

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

在此之后,今天我将机器切换到以太网,我已经运行了导致我出现问题的循环 3 次,现在错误为零。看起来非常可靠——这也是我之前使用 USB 与以太网的经验。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

我还怀疑缓冲区溢出…

哪个发件人?如果你自己是用字符计数的方法来保证缓冲区不溢出的吗?ok还是在收到响应后逐行发送?

它被分割为 0.0004″…我的机器可以机械地完成…

那是1微米?您必须拥有一台高端机器才能获得这种精度。

…但对于 100ipm 的青少年来说可能太多了

我在ioSender的检查模式下看到 USB 传输速率 > 400 Kbytes/s ,并且在调整规划器缓冲区大小时可以实现非常高的进给速率(> 50.000 毫米/分钟),即使在使用大量小线段进行激光雕刻时也是如此.
仅供参考最大。步进速率约为 300 Khz。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

也会把我的帽子扔在这里……

我今天遇到了同样的问题。我在雕刻工作的中途遇到错误 33,最初认为这实际上是 G 代码中的弧度公差问题。

但后来我无法在我工作台上的另一个 Teensy 上用相同的代码重新创建它,并在 CNC 上再次运行该作业——它再次失败,但在不同的地方。

我的 USB 连接来自与 Teensy 位于同一机柜中的 Raspberry Pi。与运行 CNCjs 的 Pi 建立以太网连接。我很想尝试直接连接到 Teensy 的以太网,但遗憾的是 IOSender 对我来说不是一个选项(家里没有 Windows 机器),并且不确定其他发件人支持它吗?

我的 VFD 安装位置和电缆布线目前有点可疑,将首先尝试改进它……

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

@dresco您可以尝试以检查模式运行吗,这将仅通过解析器运行代码(无动作)。如果这没问题,那么要么是其他地方有代码问题,要么是电气干扰。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

@dresco您可以尝试以检查模式运行吗,这将仅通过解析器运行代码(无动作)。如果这没问题,那么要么是其他地方有代码问题,要么是电气干扰。

谢谢 Terje,我敢肯定这对我的路由器构建来说一定是环境问题,因为在我桌上的笔记本电脑和裸体 Teensy 之间运行相同的代码要可靠得多(重新运行相同的工作整个下午只有一个错误) .

我想这周我会启动一个 Windows 虚拟机,看看它是如何通过以太网使用 IOSender 而不是通过 USB 使用 CNCjs 的。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

有一个测试更新,但是很奇怪!

如果我在没有 sdcard 和以太网支持的情况下构建,那么我会间歇性地看到这些错误。我正在运行雕刻测试作业(约 40k 行 gcode,在我的路由器上运行需要约 35 分钟),而且我从来没有在没有错误 2 或 33 的情况下完成整个作业。

但是,如果我在启用这些插件中的一个(或两个)的情况下构建,那么错误就会消失。我知道这听起来很奇怪,但我今天进行了数十次测试,并且非常一致!不过,我有点不知所措吗?

顺便说一句,我正在测试我的机柜没有电。Teensy 由笔记本电脑 USB 供电,除了(未供电的)步进驱动器以及各种限位开关和输入外,没有其他连接。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

但是很奇怪!

确实,您正在使用哪个版本的 Teensyduino 进行编译?
您是否以检查模式运行作业?结果一样吗?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

正在使用 PlatformIO 构建。今天的所有测试都使用他们的 Teensy 4.12 包,该包是针对 teensyduino 1.53 构建的(这是固定在当前 platformio.ini 文件中的版本)。

我之前一直在使用最新的 4.13 包,它引入了 teensyduino 1.55。但是,该插件与 SDCard 插件存在兼容性问题(请参阅问题#15)。

我还没有尝试过检查模式(我只是禁用了所有活动部件的电源),是否有 $ 命令来启用它?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

针对 teensyduino 1.53 构建

1.53是片状的…

我之前一直在使用最新的 4.13 包,它引入了 teensyduino 1.55。但是,该插件与 SDCard 插件存在兼容性问题(请参阅问题#15)。

你能在没有SD卡支持和测试的情况下构建吗?

我还没有尝试过检查模式(我只是禁用了所有活动部件的电源),是否有 $ 命令来启用它?

$C

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

$C

哈,运行得很快 ;) 在 1.53.. 的检查模式下仍然出现错误

现在在没有任何插件的情况下构建和测试 1.55,它在检查模式下成功运行了多次,因此将在正常模式下多次运行……

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
德雷斯科 评论了 2022 年 2 月 1 日  

恐怕 1.55 仍然是一些不稳定的建筑。

没有 vfd、sdcard 或网络支持,那么它很稳定。
如果我启用 vfd,但没有 sdcard 或网络,那么我会看到随机错误。
如果我启用 vfd 和网络(仍然使用 USB 连接),那么它也是稳定的。

我可以用我桌上的裸体青少年复制这个,如果你想要我可以把文件发给你吗?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

我可以用我桌上的裸体青少年复制这个,如果你想要我可以把文件发给你吗?

我想让你先用这个修改来测试,它为输入数据的函数轮询添加了一个重入锁:

static void usb_execute_realtime (sys_state_t state)
{
    static volatile bool lock = false;
    static char tmpbuf[BLOCK_RX_BUFFER_SIZE];

    if(lock)
        return;

    char c, *dp;
    int avail, free;

    lock = true;

    if((avail = usb_serial_available())) {

        dp = tmpbuf;
        free = usb_serialRxFree();
        free = free > BLOCK_RX_BUFFER_SIZE ? BLOCK_RX_BUFFER_SIZE : free;

        avail = usb_serial_read(tmpbuf, avail > free ? free : avail);

        while(avail--) {
            c = *dp++;
            if(!enqueue_realtime_command(c)) {
                uint_fast16_t next_head = BUFNEXT(rxbuf.head, rxbuf);   // Get next head pointer
                if(next_head == rxbuf.tail)                             // If buffer full
                    rxbuf.overflow = On;                                // flag overflow,
                else {
                    rxbuf.data[rxbuf.head] = c;                         // else add character data to buffer
                    rxbuf.head = next_head;                             // and update pointer
                }
            }
        }
    }

    lock = false;
}
错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

我想让你先用这个修改来测试

恐怕没有区别

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

不过,沿着同样的思路,这促使我改用 Arduino USB 库进行构建 – 并且它已经完全稳定(在检查模式下运行代码 10 次以上,没有错误)

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

我已经使用 PJRC 库在测试模式下多次运行一个 186785 行的程序,在启用 SD 卡和 VFD 时没有出现问题,使用 Arduino 和 Teensyduino 1.54 编译。PlatformIO 导致问题还是 1.55 版本?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

我已经使用 PJRC 库在测试模式下多次运行一个 186785 行的程序,在启用 SD 卡和 VFD 时没有出现问题,使用 Arduino 和 Teensyduino 1.54 编译。PlatformIO 导致问题还是 1.55 版本?

使用 VFD 构建但没有 SD 卡或网络时,它对您来说仍然稳定吗?我刚刚用 1.54 进行了重建,但仍然在这里看到同样的错误。

fwiw,整个下午(使用 Arduino USB 库)都在我的路由器上进行同样的工作,而且它一直坚如磐石。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

只是更多的数据..

我在 protocol.c 中添加了一行以回显 gc_execute_block() 返回错误时收到的内容,它总是被破坏。接收到的行要么被截断,中间缺少一个块,要么将来自不同行的数据合并到其中!?

作为一个极端的例子,这个实例在第 8782 行失败,但解析的行中嵌入了来自第 8730 和 8783 行的 gcode。几乎就像缓冲区指针在写入接收到的数据时弄乱了一样?

[echo: G1X174.048162.000Y51.233Z-0.499I0.649J3.912Y100.622Z-0.499F799.998]
> G1 X174.048 Y100.805 Z-0.499 F799.998 (line=8782)
error:1 (Expected command letter)
错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

我使用不同的测试文件使 PJRC 代码失败。与 Arduino 代码不同,它似乎不喜欢被过于频繁地轮询。降低轮询频率似乎有所帮助:

static void usb_execute_realtime (sys_state_t state)
{
    static volatile uint32_t last_micros = 0;
    static volatile bool lock = false;
    static char tmpbuf[BLOCK_RX_BUFFER_SIZE];

    uint32_t current_micros;
    if(lock || ((current_micros = micros()) - last_micros) < 250)
        return;

    char c, *dp;
    int avail, free;

    lock = true;
    last_micros = current_micros;

    if((avail = usb_serial_available())) {

        dp = tmpbuf;
        free = usb_serialRxFree();
        free = free > BLOCK_RX_BUFFER_SIZE ? BLOCK_RX_BUFFER_SIZE : free;

        avail = usb_serial_read(tmpbuf, avail > free ? free : avail);

        while(avail--) {
            c = *dp++;
            if(!enqueue_realtime_command(c)) {
                uint_fast16_t next_head = BUFNEXT(rxbuf.head, rxbuf);   // Get next head pointer
                if(next_head == rxbuf.tail)                             // If buffer full
                    rxbuf.overflow = On;                                // flag overflow,
                else {
                    rxbuf.data[rxbuf.head] = c;                         // else add character data to buffer
                    rxbuf.head = next_head;                             // and update pointer
                }
            }
        }
    }

    lock = false;
}

BLOCK_RX_BUFFER_SIZE增加到 128 会稍微加快速度。你也可以用这个测试吗?您也可以尝试更改轮询间隔 – 150 对我来说失败了。我不知道什么是安全值——所以让 Arduino 实现成为默认值也许更好?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

担心轮询间隔对我的工作台设置没有显着影响,我上升到 > 1000 uS,但仍然看到错误。增加 BLOCK_RX_BUFFER_SIZE 确实可以在更高的轮询间隔内加快速度,但我找不到稳定的组合。

我会投票赞成让 Arduino 实现成为现在的默认实现。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

增加 BLOCK_RX_BUFFER_SIZE 确实可以在更高的轮询间隔内加快速度,但我找不到稳定的组合。

我也不会,故障频率随着不同的时间间隔而变化。令我困扰的是,启用以太网或 SD 卡会使问题消失。为什么?因为启用了额外的 MCU 外设?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

您可以尝试仅启用 OpenPNP 插件吗?

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

可以确认仅启用 VFD + OpenPNP 插件它看起来稳定,并且仅启用 OpenPNP 插件。(在检查模式下针对裸板运行)。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

当没有启用插件时,用这个替换初始化代码是一个“修复”。我们是否在某处有内存泄漏并且设置hal.user_mcode.execute可以防止它导致问题?有任何想法吗?

static void userMCodeExecute (uint_fast16_t state, parser_block_t *gc_block)
{
    hal.stream.write("[MSG: Hi!]" ASCII_EOL);
}

const io_stream_t *usb_serialInit (void)
{
    PROGMEM static const io_stream_t stream = {
        .type = StreamType_Serial,
        .state = { .is_usb = On },
        .read = usb_serialGetC,
        .write = usb_serialWriteS,
        .write_char = usb_serialPutC,
        .write_n = usb_serialWrite,
        .enqueue_rt_command = usb_serialEnqueueRtCommand,
        .get_rx_buffer_free = usb_serialRxFree,
        .get_rx_buffer_count = usb_serialRxCount,
        .reset_read_buffer = usb_serialRxFlush,
        .cancel_read_buffer = usb_serialRxCancel,
        .suspend_read = usb_serialSuspendInput,
        .set_enqueue_rt_handler = usb_serialSetRtHandler
    };

//    usb_serial_configure(); // Done somewhere already - do not call again
    txbuf.s = txbuf.data;
    txbuf.max_length = usb_serial_write_buffer_free(); // 6144
    txbuf.max_length = (txbuf.max_length > BLOCK_TX_BUFFER_SIZE ? BLOCK_TX_BUFFER_SIZE : txbuf.max_length) - 20;

    grbl.on_execute_realtime = usb_execute_realtime;
    hal.user_mcode.execute = userMCodeExecute;

    return &stream;
}

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31

有任何想法吗?

不,老实说我很困惑!我现在要出差几天,但有笔记本电脑和一块裸板用于必要时进行测试。

错误:2 - 缺少预期的 G 代码字值或数值格式无效。 #31
贡献者

编译器或链接器错误?

在我看来,只有
#define SPINDLE_RPM_CONTROLLED
grbl/config.h 中取消注释时才会出现问题。

喜欢 (0)