如何优化大数据字符串的串行通信?
How do I optimize serial communication for large data strings?
我正在使用 Arduino Uno 和 WS2812b LED 条纹。
我想做什么:
所以我有一个 12 x 10 的 LED 网格,我制作了一个软件,可以将这些 LED 映射到我可以绘制的相同大小的纹理。
我现在想制作多个纹理并将它们一个一个地发送到arduino以创建类似动画的东西,这样我就不必自己编写像素位置代码了。
问题:
如果我只是将此数据作为字符串中的数字发送,则缓冲区大小需要 120 * 12 字节 = 1440 字节。
我试图将数字转换为十六进制值。但是我仍然需要 960 字节的缓冲区。
任何更高的基在这里都无济于事,因为即使使用 base36,我也需要 2 个字符来表示 255。
我的做法:
- 我可以将 Arduino 的缓冲区大小更改为 960,但 RAM 是
99% 用完了,arduino 软件告诉我稳定性问题
可能会发生,我想这正在发生,因为这种方法确实
不工作。
- 另一种方法是对从 0 到
255. 这可以将字节总数减少到 480,但 Arduino 只知道 128,前 32 个被
系统.
- 我也尝试过使用不同的缓冲区大小按顺序发送数据,但串行通信速度很慢。您可以看到它是如何从上到下“绘制”图像的。所以好想一下子画完
我能否以某种方式扩展 ASCII 字符 table 或创建自己的字符?
或者我可以将原始字节数据发送到 arduino 而不是使用 strings/char 数组吗?
或者你有其他的方法吗?我很好奇。
我现在有一个或多或少好的解决方案。
我只是将 LED 索引作为十六进制字符串和一个字符发送过来,告诉我它是打开还是关闭。
这将总量减少到 360 字节,但我只能在 arduino 端设置颜色。
RGB 有 3 个字节,寻址一个 120 的 LED 需要 1 个字节。为什么您认为它需要 12 个字节而不是 4 个字节?也许你必须在真实地址转换中添加一些内部索引。
而且如果您始终发送所有像素,则根本不需要发送地址。进行 360 字节 + 一些开始同步,这可能是串行线路上的“中断”。
在 115200 这将以大约 30 fps 结束。
此外,您可以进行一些“打包”,例如之前发送一次色图,然后 select 使用 256 色色图中的 1 个字节,以 90 fps 结尾。
我正在使用 Arduino Uno 和 WS2812b LED 条纹。
我想做什么:
所以我有一个 12 x 10 的 LED 网格,我制作了一个软件,可以将这些 LED 映射到我可以绘制的相同大小的纹理。 我现在想制作多个纹理并将它们一个一个地发送到arduino以创建类似动画的东西,这样我就不必自己编写像素位置代码了。
问题:
如果我只是将此数据作为字符串中的数字发送,则缓冲区大小需要 120 * 12 字节 = 1440 字节。 我试图将数字转换为十六进制值。但是我仍然需要 960 字节的缓冲区。 任何更高的基在这里都无济于事,因为即使使用 base36,我也需要 2 个字符来表示 255。
我的做法:
- 我可以将 Arduino 的缓冲区大小更改为 960,但 RAM 是 99% 用完了,arduino 软件告诉我稳定性问题 可能会发生,我想这正在发生,因为这种方法确实 不工作。
- 另一种方法是对从 0 到 255. 这可以将字节总数减少到 480,但 Arduino 只知道 128,前 32 个被 系统.
- 我也尝试过使用不同的缓冲区大小按顺序发送数据,但串行通信速度很慢。您可以看到它是如何从上到下“绘制”图像的。所以好想一下子画完
我能否以某种方式扩展 ASCII 字符 table 或创建自己的字符? 或者我可以将原始字节数据发送到 arduino 而不是使用 strings/char 数组吗?
或者你有其他的方法吗?我很好奇。
我现在有一个或多或少好的解决方案。
我只是将 LED 索引作为十六进制字符串和一个字符发送过来,告诉我它是打开还是关闭。 这将总量减少到 360 字节,但我只能在 arduino 端设置颜色。
RGB 有 3 个字节,寻址一个 120 的 LED 需要 1 个字节。为什么您认为它需要 12 个字节而不是 4 个字节?也许你必须在真实地址转换中添加一些内部索引。
而且如果您始终发送所有像素,则根本不需要发送地址。进行 360 字节 + 一些开始同步,这可能是串行线路上的“中断”。
在 115200 这将以大约 30 fps 结束。
此外,您可以进行一些“打包”,例如之前发送一次色图,然后 select 使用 256 色色图中的 1 个字节,以 90 fps 结尾。