开源改变世界

软件波特率选择器(通信失败 #1535

推推 grbl 3年前 (2023-01-24) 394次浏览

关闭
harms2019 开了这个issue 2019 年 7 月 16 日 · 11 条评论
关闭

软件波特率选择器(通信失败#1535

harms2019 开了这个issue 2019 年 7 月 16 日 · 11 条评论

注释

软件波特率选择器(通信失败 #1535

修复串行通信

大家好,

曾几何时,当我还是一名年轻的电子学生时,在110波特的波特率提高到令人生畏的9600波特的时代,我们曾经自己组装和维修RS232串口设备。在没有任何内部和外部知识的情况下,这几乎是不可能完成的任务。串行通信中最不可捕捉的部分是噪音和干扰,由邻居的厨房机器、湿度、静电和闪电等条件、家庭成员使用电灯开关等引起。没有这些因素,世界将是完美的。随着时间的推移,串行通信从 RS232 改进为 16 Gbits/秒的 USB 3.2。然而,……串行通信的不可捕获部分并没有宣布自己已经过时,但仍然在那里破坏了聚会。

由于grbl使用默认波特率115.200波特,一旦通信突然中断,停止,自杀,许多grbl用户感到困惑;“我做错什么了?”。

首先; 第一部分是“信号屏蔽”。对于制造商;通过适当的屏蔽防止噪声和干扰甚至到达信号线。这适用于所有信号线;开关、末端开关、每个输入信号(包括零伏线)都必须屏蔽,并且中央“星形接线”连接到一个“信号接地”。打开的 PC 机壳不再屏蔽信号噪音。开放式有线电子网络作为 CNC 机器旁边桌子上的设备通常与构建“噪声天线”相同。

第二部分是生活本身。世界并不完美,狗屎总会发生。噪音确实经常破坏聚会。有时有点翻滚。在串行通信中,RX 移位寄存器有时来不及捕捉到信号上升。USB 电缆太长,开始出现干扰“信号回波”。PC 上使用的 USB 端口速度太慢或噪音太大(尝试另一个)。USB 电缆没有充分屏蔽(尝试另一根)。串行通信中断的原因有很多。grbl 新手起初对电缆类型感到困惑;“我使用的是 USB,不是 RS232!”。然而,Arduino 的处理器确实使用老式的 RS232。因此在Arduino中增加了一个特殊的USB转串口芯片,用于使用USB作为包络发送RS232信号。

设置 RS232 最佳波特率是第三部分。在工业环境中,只要测试当前通信速度正常,通常的做法是手动将波特率提高到下一个设置。在波特率设置为高的那一刻,通信中断,所以以前的波特率是最优的。这种加速-切换-减速技术是通过设计嵌入到 USB 协议本身中的,并保证向下兼容性和尽可能高的速度设置;可以在 USB 3.0 端口上使用 USB 1.0 设备,反之亦然。

默认情况下,出于模拟实时加工的原因,grbl 将 RS232 通信的最小波特率设置为 115.200 波特(请记住,模拟实时根本不是真正的实时!)。在嘈杂或干扰严重的环境中,此默认速度可能非常高。每当串行通信经常发生故障时,建议降低 grbl 的波特率。不幸的是,没有简单的方法可以实现这一点。

Arduino IDE 软件工程师下载 grbl 源代码,打开 config.h,找到波特率设置,将其更改为新的波特率值,编译并将修改后的 grbl 软件上传到 CNC 机器的 Arduino。

对于普通的 3D 打印机/激光切割机爱好者来说,这不是一项简单的任务。

功能要求。

在以前的时代,串行设备曾经有一个波特率选择器开关。改变波特率是一个简单的旋转旋钮,任何人都可以做到。仔细考虑;为什么不使用像 $B 这样的新 grbl $ 变量来设置 Arduino 的 FT232R 芯片的波特率?Bij 更改 $B 值并重新启动,每个人都可以简单地更改、测试和修复 RS232 通信设置。

我的 Arduino IDE 经验有限,$B 功能实际上应该包含在 grbl 本身中。下面的测试示例给出了如何防止 $B 出现奇数或错误值,以及如何设计软件波特率选择器的想法。

grbl_baud-proposal.pdf

软件波特率选择器(通信失败 #1535
成员

@Harms2019: 是的,拥有它会很不错。然而,如果你没有注意到,最新的固件将 328p 的闪存和内存完全打包到最大。必须省略小的用户友好改进(仍然可以通过 config.h 和重新编译进行更改)。不过别担心,其中大部分将在下一个主要版本(很快)中解决。

软件波特率选择器(通信失败 #1535

降低波特率以尝试修复干扰就像在断腿上贴创可贴一样

软件波特率选择器(通信失败 #1535
危机 评论了 2019 年 7 月 18 日 通过电子邮件
软件波特率选择器(通信失败 #1535

如果您将 Arduino Uno 与 Atmega16u2 USB 转串行设备一起使用,则两个微控制器都以相同的方式从 16Mhz 振荡器(可能来自同一批次)生成波特率时钟,在相同的电压和大致相同的温度下运行,因此它们之间的相对误差应该远小于数据表中给出的绝对误差。

软件波特率选择器(通信失败 #1535
危机 评论了 2019 年 7 月 18 日 通过电子邮件
软件波特率选择器(通信失败 #1535
作者

好吧,正如已经说过的那样,细节决定成败。另一个小问题是大多数波特率计算使用很好的整数值,如 300、600、1200、2400、4800 和 9600 波特。但是,如果使用 8 甚至 16 Mhz xtal,所需的波特率越高,生成正确的波特率就越困难。计算捕获带宽时,必须考虑实际波特率值,例如 FT232R、FT2232 和 FT232 在理论现实中的 19230、38461、57692、115384、230769、461538 和 923076 波特。记住; 这种不匹配是在 Arduino 方面。不清楚的是在 PC 端生成的波特率不匹配,其中 RS232 信号被封装在 USB 数据包中。仔细考虑(尤其是 2 米或更长的距离),

软件波特率选择器(通信失败 #1535

即便如此,细节仍是罪恶所在。UNO R3 使用 8mhz xtal,主处理器 16mhz 谐振器。

你确定吗?我以为 Uno 上的两个微控制器的时钟频率都是 16Mhz。这似乎是官方 Arduino 原理图显示的内容。由于它们都是具有相同类型串行外围设备的 AVR,即使波特率发生器存在百分之几的理论误差,两个设备也应该具有完全相同的误差。

软件波特率选择器(通信失败 #1535

好吧,正如已经说过的那样,细节决定成败。另一个小问题是大多数波特率计算使用很好的整数值,如 300、600、1200、2400、4800 和 9600 波特。但是,如果使用 8 甚至 16 Mhz xtal,所需的波特率越高,生成正确的波特率就越困难。计算捕获带宽时,必须考虑实际波特率值,例如 FT232R、FT2232 和 FT232 在理论现实中的 19230、38461、57692、115384、230769、461538 和 923076 波特。记住; 这种不匹配是在 Arduino 方面。不清楚的是在 PC 端生成的波特率不匹配,其中 RS232 信号被封装在 USB 数据包中。仔细考虑一下(尤其是 2 米或更长的距离),跳过 USB 电缆布线甚至可能是一个更好的主意,

串行传输(技术上不是 RS232,因为它发生在 5V 逻辑电平)仅发生在安装在 PCB 上相距约一英寸的两个芯片之间。链接的 USB 端与波特率设置无关。您是否有证据表明 Arduino 上两个芯片之间的连接导致数据损坏?如果是这样,您是否有机会在 CNC 旁边进行电弧焊?

软件波特率选择器(通信失败 #1535
危机 评论了 2019 年 7 月 19 日 通过电子邮件
软件波特率选择器(通信失败 #1535
作者

好吧,抱歉大家把球棒扔进了鸡舍。

Arduino 处理器和 USBtoRS232 之间的通信对我来说似乎不是瓶颈。但是,如果 Arduino 设置为 115200 波特,则 FT232R 芯片的实际值为 115384 波特。然而,许多人并没有意识到 USB 实际上是“下一代串行 RS232”,并且有其自身的设计缺陷。

现代 PC 比 Arduino 的 8 或 16 Mhz 基频快得多。PC 上的 grbl GUI 使用 RS232 终端应用程序,应该设置为与 Arduino 相同的速度。如果在 PC 端,RS232 信号是完全基于 115200 波特的软件构建,则存在 184 波特的不匹配。这个最终不匹配的 RS232 信号(-一个字母-)被移交给 RS232toUSB 应用程序,该应用程序将软件信号“封装”在几个后续的 USB 数据包中。此操作系统依赖的 USB 应用程序(“设备”)是连接到 USB 主机芯片(EHCI、UHCI 等)的操作系统独立的软件和硬件,它被视为 127 个可能的 USB 网络客户端之一。当 USB 主机发现它适合时,它会将封装的信号包发送到 USB 客户端“Arduino”(或“CH340” 或“ACM0”或使用的任何名称),USBtoRS232 芯片将提取软件数据包并将其内容重建为电压硬件信号。FT内置UART的Rx-和Tx-shiftregister可以处理一定量的失配;称为捕获带宽(有关更多信息,请参阅 FT232 扩展数据表。)。假设 PC 的 Tx 和 Arduino 的 Rx 在完全相同的百分比小带宽内工作;只要 Rx 在低侧捕捉到,而“Tx 发送”在高侧,通信就会启动并运行。如果模态 Tx 和/或 Rx 基频之一或两者发生偏移(通常由干扰或噪声的副作用(尖峰)引起),通信就会丢失。在完美的世界中,计算(如前所述)将给出答案。

那是一部分。另一个问题是 USB 的硬连线 T 网络本身。为了跟踪所有连接的 USB 客户端设备,USB 主机会定期暂停正在进行的数据包发送,以检查哪些 USB 设备在线;此功能使 USB 可以“热插拔”(但也会中断正在运行的通信)。随着“接收波特率”的每次增加,允许的“检查设备中断”时间越短。同一个 USB Host 上连接的 USB 设备越多,有效数据包速度就越低。由于允许 127 个设备;为什么我的电脑有 7 个不同的 USB 主机芯片?为什么会这样?许多 Arduino IDE 用户遇到的“不同步错误”,通常可以通过断开所有 USB 设备(使用有线键盘和鼠标)来解决,并在每个可用的 USB 端口测试上传到 Arduino。在计算的实验室条件下,所有这些 USB 主机电路条件应该相同;在现实世界中,事实证明这根本不是真的。

在 USB 端,Arduino 将自己标识为“USB 1.01 Class 2”,这意味着主机-客户端技术是一种主从协议。FT232 不可能自己发送“数据请求”。由于无法以任何方式访问通信中断,Arduino 可能很容易“超时”。因此,将最好的 USB Host 保存为 Arduino 的单个主机。

最后但并非最不重要的; 一个非常不愉快的未被怀疑的侏儒是“节能”。某些 3D 打印机作业可能需要 13 个小时以上才能完成。对于这样的加工持续时间,110 波特的波特率就可以了。9600 波特的通用整体波特率对于几乎所有 CNC 机器来说都足够快了。为什么要将默认波特率从 9600 加速到 115200?想象一下,这就像骑自行车从 9.6 km/h 加速到 115 km/h。引用阿姆斯特朗先生的话“……不是一小步,而是一大步……”。为避免不必要的中断,人们往往会在开始 CNC 作业后让 PC 保持原样。如果 PC 的节能没有关闭,那么过一段时间就会切换到节能模式,这可能会导致 PC 和 USB 速度下降,甚至进入暂停休眠(深度睡眠)。

回到这开始的地方。… 为了避免吸入二恶英而中毒或死亡,我不得不将激光切割机放在更(对我而言)更健康的位置。我不得不使用三根 2 米长的 USB 电缆。是的,这是自找麻烦,很快就经常通讯中断了。很快就发现了原因并实施了解决方案。解决我的问题时,我注意到与以前的 grbl 版本相比波特率大大提高,并且只需更改波特率值就必须付出巨大的努力。在互联网上四处张望、搜索和查探,我发现许多 grbl 和 Arduino 用户都存在沟通问题,并且正在努力修复它。“我们已经测试了这个设置,没有发现任何问题”。当然,一级方程式赛车在一级方程式赛道上创造了巨大的速度记录。然而,在现实世界中,人们往往不生活在赛道上,而是生活在崎岖不平的坑坑洼洼的小路上。如果报童试图通过使用一级方程式赛车来提高送货速度,那么,这取决于他。但不要因为汽车卡住、抛锚或撞墙而来找我。“我只想要我的日报;不多也不少”。

Thinking it all over, I made the suggestion to the grbl team to add a new $B parameter as baudrate-settings and chancing init’s Serial.Begin([baudrate]) into Serial.Begin($B) . Every grbl-user can simply change the grbl’s baudrate very easy if necessary. To prevent losing contact by entering invalid values, I also added a small checking routine. No big deal.

Thats all folks!

P.S. If I break my leg and bones are sticking out of the skin, I prefer a bandaid as soon as possible to prevent future amputation.

软件波特率选择器(通信失败 #1535
cri-s commented 2019 年 7 月 20 日 via email
喜欢 (0)