注释
@mkeyno请提供一些反馈 |
亲@arkypita 非常感谢您的关心,很抱歉迟到了,我进行了一些测试以检查是否有稳定的 websocket 链接,但是会话日志和我的 esp 日志没有报告任何 websocket 链接,我也尝试阅读您的代码任何 websocket 连接,但没有找到相似的(如果有请纠正我) #include <ESPAsyncWebServer.h>
AsyncWebServer server(80);
AsyncWebSocket WS("/ws");
....
void loop ( void )
{
SerialEvent();
if(NewLine && (millis()-serialTS)>50){ WS.text(inputString); inputString = ""; serialTS=millis();NewLine=false;}
if(INFO) {if( (millis()-Last_query)>210 ) {Serial.print('?'); Last_query=millis();}} // send ? char to GRBL
}
以下是会话日志,如果需要更多数据或测试,请告诉我 6/15/2017 10:10:53 PM SetStatus 机器状态 [连接] |
你好@mkeyno谢谢你的回复 网络套接字?HTML?所以你在 ESP 中实现了一种网络服务器?为什么?对我来说,使用 http 和 html 通过 tcp-ip 传输串行协议似乎很奇怪! 好吧好吧…我已经阅读了https://github.com/LaserWeb/LaserWeb3-ESP8266 对我来说,最简单的方法是在 ESP8266 上实现一个 TcpListener 并将读写重定向到 rx-tx pin。我在 LaserGRBL 中实现的只是一个连接到端口并发送-接收数据的 TcpClient。(这是最简单直观的方法,我真的不明白他们为什么决定使用 websocket)。 但是我可以实现一种与“LaserWeb ESP8266”兼容的包装器。现在我已经虚拟化了管理通信的 LaserGRBL 部分,所以我可以轻松添加一个新的包装器。 幸运的是,我必须有一个 ESP8266 模块,所以当我有时间时,我可以使用 LaserWeb 提供的代码对其进行编程并进行测试。 你必须等几个星期,我现在很忙! |
当然亲爱的@arkypita,我可能会添加可靠的链接,我们需要实时协议,例如 websocket,否则 tcp 链接将阻塞流数据,websockt 易于安装在 web 平台或 .net 平台上,这就是大多数人选择 websocket 的原因 |
你好@mkeyno 我使用这个模式进行编程:
就像在 .gif 图像中一样,我可以连接到 Emblaser2 网络,使用默认 IP 地址联系 ESP,配置我的网络并将 ESP 连接为我的 LAN 的一部分,现在我可以 ping 路由器 DHCP 分配的地址 (192.168.1.170) . 我也已经将 ESP 连接到 arduino,就像在这个模式中一样,arduino 上加载了 Grbl v1.1。 LaserWeb3 和 LaserWeb4 都无法连接到 ESP,我一直卡在这个问题上。 LW4 控制台说;
如果我在 192.168.1.170 上打开浏览器,我有一个 404 页面,其中未找到:/ 你能帮助我吗?使用 laserweb 的 WiFi 网桥是确保我编写的代码 100% 兼容的唯一方法。 |
已解决:我必须使用端口 81 现在我有其他类型的问题,但我想我可以解决它们 |
@mkeyno我知道了! |
@mkeyno |
做得好 @arkypita 你能告诉我你程序中的 websocket 方法吗?您是否使用重新连接 websocket 客户端来使链接稳健? |
测试版:https 所有关于 ESP 的代码都在这个文件中:https ://github.com/arkypita/LaserGRBL/blob/LaserWebESP8266/LaserGRBL/ComWrapper/LaserWebESP8266.cs 我使用了websocket-sharp实现,因为微软只在 .NET framework 4 中实现了 websocket,我喜欢使用 framework 3.5,因为 framework 4 与 Windows XP 不兼容。 |
现在我已经在 ESP 和 Arduino 之间使用 9600baud 进行了测试,但我仍然遇到与 3 条消息之前相同的问题。 这一刻我想不通:
也许您可以帮我测试一下您的硬件是否更稳定,这样我们就可以了解是硬件问题还是 LaserGRBL SW 问题。 |
你也可以和我分享你的ESP代码吗? |
我还实现了一种“通过 websocket 的 grbl 模拟器”(模拟 ESP Websocket 服务器和 Arduino 响应)。模拟器可从“?-> grbl 模拟器”获得,并以 ws://127.0.0.1:81/ 收听 当然,使用模拟器一切正常:-) |
亲@arkypita请检查数据文件夹中的 html 文件,我设计了该网页,以便用户可以更改 GRBL 设置以及 wifi 网桥,我的计划是使用文件阅读器 javascrip上传文件,然后根据 GRBL advance将代码发送到 ESP stream 方法,在 ESP 中将接收到的数据打印到Arduino 串口 else if(cammand=="RAW") {if(!STARTING) {Serial.print(value); CODE="CNC@"; serialTS=millis(); }}
并在 websocket 链接上发送 GRBL 响应 SerialEvent();
if(NewLine && (millis()-serialTS)>50){ WS.text(MainWSclinet,CODE+inputString); inputString = ""; serialTS=millis();NewLine=false;}
|
@mkeyno感谢您的分享。我需要一点时间来理解你的 wifi-bridge 的代码,因为它非常复杂(有很多功能,不仅仅是基本的流媒体)。 你试过2.6.13版本吗?现在应该可以通过 WebSocket 进行通信了。 必须在设置中启用 ESP8266 协议,然后才能配置为简单的 URL。 如果我将它与我的 ESP8266 一起使用,用LaserWeb3-ESP8266代码编程,我可以连接成功,我也可以流式传输一些 GCode,但是流式传输过程很慢,打嗝,grbl 响应给出错误(如上一张图片)突出显示一些整个行程中的数据丢失。 我非常想知道 LaserGRBL v2.6.13 是否连接到您的 ESP8266 或者它是否没有连接,以及流式传输行为是否正确或者是否存在与我相同的问题。 LaserGRBL从第一个版本开始就实现了建议的字符计数流协议(如 stream.py)。 在 LaserGRBL 方面,我使用 USBSerial 和 WebSocket 协议的字符计数,因为它的实现是在外部并且独立于所选的通信通道。 |
@arkypita我使用 ws://192.168.4.1/ws 地址连接到 ESP,websocket 链接稳定,但是我的 ESP 没有连接到 GRBL,所以它无法响应,因此我无法发送 gcode 数据流,你能创建测试版本吗所以我可以不受任何限制地将cnc数据传输到ESP并检查流链接的可靠性, |
好的,很好!
当 arduino/grbl 未连接时,我有 2 个不同的限制阻止流式传输文件的能力
我很容易删除这两个测试。没关系,或者你更喜欢我只删除第一张支票,然后你从 ESP 发回“ok”? |
我找到了所有问题的原因! 这是因为我发送“\r\n”作为线路终止,因为 grbl 标准只需要“\n”。 |
做得好@arkypita,你检查过我的库了吗?您对 ESP 中的控制流机制有何看法 |
是的,没有。我已尝试加载您的代码,但找不到将 ESP 连接到我的网络的方法,因此我继续使用为 LaserWeb 提供的代码进行开发
Grbl 只有 128 个宽字符命令缓冲区。因为经典的弧形移动 (G2 X0.000 Y0.000 I0.000 J0.000) 大约有 30 个字符宽,所以您不能排队超过 4-5 个移动命令。 当一系列很多小动作排队时,这可能会导致一些瓶颈。当运动的执行时间小于串行传输时间时,可能会发生一些缓慢的情况。缓冲区可以提供帮助(将 chars-long exec-fast 命令与 chars-short exec-slow 命令进行平均),但如果缓冲区太小则作用不大。 做一些数学运算,每个命令字符的传输需要 10 位(ASCII 码 8 位 + 1 位起始位 + 1 位停止位)所以 30 个字符需要 300 位。对于 115’200 的波特率,这意味着每秒 384 个 30 个字符的不同命令的带宽。(每个命令传输大约 2-3 毫秒)。 该速度足以满足几乎所有矢量雕刻需求,尤其是低功率激光,但如您所知,在使用中等功率激光雕刻高速光栅图像时可能会出现问题。#38 所有这些都是由于串行通道速度和协议 – gcode – 不适用于光栅图像传输的限制。 |
添加 ESP8266 后,所有这些限制仍然有效,因为串口的使用并未完全被 WiFi 取代,并且 grbl 缓冲区大小仍然保持不变。 然而,可能发生的情况是 WiFi 的干扰或速度减慢可能会中断与 ESP8266 的通信。在这些情况下,利用 ESP 内存在雕刻机一侧拥有更大的缓冲区听起来可能很明智。 |
ESP 的一个好的代码应该异步接收来自流媒体程序的任何字符并放入它自己的“大缓冲区”。显然,流媒体必须知道“大缓冲区”的大小并使用此限制而不是 128 个字符的限制。尽可能快地将命令从 PC 传输到 ESP。 ESP 中的另一个异步作业必须实现“128 个字符计数”机制,将命令排队到 grbl(不从其知识中删除)并检查 grbl 响应(正常或错误)以从其队列中删除该命令并“释放”计数128,并将响应传回流光(实现相同的字符计数,但使用“大缓冲区”大小)。 这在高级编程语言中很容易做到,你可以在高级编程语言中管理列表、队列、字符串等对象,但在纯 arduino c/c++ 中就没那么容易了 由于 WiFi 速度通常高于串行速度,在我看来,所有这些复杂性并不是真正的优势。所以我建议 ESP 只做 wifi-serial 桥接,没有任何缓冲或“智能” |
我还为 ESP8266 创建了一个 TelnetToSerial 实现来摆脱 WebSocket 的需求,这对于实现目标来说确实是不必要的,所以现在 LaserGRBL 可以轻松地通过 WebSocket 或通过 Telnet 连接到它自己的 ESP。 |
应用户要求@mkeyno我想添加通过 WiFi 以太网连接的功能。
我开发了一个带有 tcp-ip 连接的版本,但我无法测试它,因为我的 arduino 板没有以太网适配器。
有人可以测试它并提供一些反馈吗?
下载链接:https ://github.com/arkypita/LaserGRBL/releases/tag/v2.6.10