如何优化大数据字符串的串行通信?

Posted

技术标签:

【中文标题】如何优化大数据字符串的串行通信?【英文标题】:How do I optimize serial communication for large data strings? 【发布时间】:2021-12-25 15:16:03 【问题描述】:

我正在使用 Arduino Uno 和 WS2812b LED 灯条。

我想做的事:

所以我有一个 12 x 10 的 LED 网格,并且我制作了一个软件,可以将这些 LED 映射到相同大小的纹理,我可以绘制到该纹理。 我现在想制作多个纹理并将它们一一发送到 arduino 以创建类似动画的东西,这样我就不必自己编写像素位置了。

问题:

如果我只是将此数据作为字符串中的数字发送,则缓冲区大小需要 120 * 12 字节 = 1440 字节。 我试图将数字转换为十六进制值。但是我仍然需要 960 字节的缓冲区。 任何更高的基数在这里都无济于事,因为即使使用 base36 我也需要 2 个字符来表示 255。

我的方法:

我可以将 Arduino 的缓冲区大小更改为 960,但是 RAM 是 99%用完了,arduino软件告诉我稳定性问题 可以发生,我猜这正在发生,因为这种方法确实 不工作。 另一种方法是对从 0 到 0 的每个值使用 ASCII 字符 255. 这可以将字节总数减少到 480 但 Arduino 只知道 128 并且前 32 被 系统。 我还尝试使用不同的缓冲区大小顺序发送数据,但串行通信速度很慢。您可以看到它是如何从上到下“绘制”图像的。所以我真的很想一次画完。

我能以某种方式扩展 ASCII 字符表或自己制作吗? 或者我可以将原始字节数据发送到 arduino 而不是使用字符串/字符数组吗?

或者你有其他方法吗?我真的很好奇。

【问题讨论】:

您的价格是多少? Arduino 确实可以支持 115200bps,可以在不到 100 毫秒或 10 fps 的时间内发送您的图像。 @Jellyboy 我用 115200bps 尝试过,并以 60 fps 从 C# 发送数据,但绘制图像仍然需要很长时间(人眼无法注意到),因为我必须按顺序发送它,并且当我更新例如第一行但循环已经在第二行中时,我必须等待所有其他行被处理以再次更新第一行。 我对arduino不是很熟悉。您不能按原样(以二进制形式)发送数据吗?对可读字符进行编码/解码似乎是不必要的开销。 @Gene 除了在 arduino 端接收一个 char 数组外,没有找到任何更好的方法。 @Jellyboy 它是 RGB。每个 LED 都有一个索引。这就是为什么每个 LED 需要 12 个字节的原因。我可以只使用 4 个字节,3 个用于索引,1 个用于开/关,但我只能控制 arduino 上的 LED 颜色……但正如 KamilCuk 在他的评论中所说,我已经达到了董事会的极限我大概会采用 4 字节的方法。这将总量减少到 480 【参考方案1】:

RGB 有 3 个字节,寻址一个 120 的 LED 需要 1 个字节。为什么您认为它需要 12 个字节而不是 4 个?也许您必须在实际地址转换中添加一些内部索引。

如果您总是发送所有像素,则根本不需要发送地址。进行 360 字节 + 一些开始同步,这可能是串行线路上的“中断”。

在 115200 时,这将以 30 fps 左右结束。

此外,您还可以进行一些“打包”,例如之前发送一次颜色图,然后从以 90 fps 结束的 256 种颜色的颜色图中选择 1 个字节。

【讨论】:

你是对的。我之前发送了 12 个字节,因为在 arduino 方面,读取 char 数组要容易得多。加上索引和 r、g、b 值,每个 LED 加起来最多 12 个字节。但我现在意识到,我根本不需要索引。【参考方案2】:

我现在有一个或多或少好的解决方案。

我只是将 LED 索引作为十六进制字符串发送,并结合一个字符告诉我它是打开还是关闭。 这将总量减少到 360 字节,但我只能在 arduino 端设置颜色。

【讨论】:

你应该可以直接发送二进制文件,不需要十六进制编码。您是否有理由需要发送索引?也许你可以只发送一组颜色?假设您需要 3 个字节来编码颜色+开/关状态,那么所有内容都是 12×10×3=360 个字节。 为什么需要发送索引?只需按顺序发送所有 LED。

以上是关于如何优化大数据字符串的串行通信?的主要内容,如果未能解决你的问题,请参考以下文章

Arduino - 处理串行通信

与科学仪器的串行通信

串行通信写入

没有与连接的串行端口通信?

使用 VSPE 的 WPF 中的串行端口通信问题

单片机串行口介绍