【问题标题】:Is a string the most efficient way to send this data?字符串是发送此数据的最有效方式吗?
【发布时间】:2016-03-14 12:45:42
【问题描述】:

我正在使用 Arduino 发送超过 3 个旋转轴和 3 个按钮状态。目前我正在将其格式化为这样的字符串:

“#235#12#32$TlR”

前 3 个数字是旋转,t、l、r 是按钮,大写字母告诉我按钮是否被按下。

我正在使用以下方式将数据写入 com 端口:

Serial.println

使用我的电缆一切都很好,但是当我切换到蓝牙时(我连接了一个模块),旋转有很大的延迟。

字符串是否太大而无法通过蓝牙以每秒 30 次的速率发送?有没有办法将我的数据格式化为更小的包?

非常感谢!

【问题讨论】:

  • 它很可能太小了:一些类似 Nagle 的算法正在等待是否有更多数据到达,以便可以发送更高效、更大的空侧 PDU。
  • 不管怎样,你的 APDU 已经很小了,没有任何意义进一步缩小它。

标签: c bluetooth arduino serial-port


【解决方案1】:

二进制肯定会更小 - 假设每个轴都适合一个字节,而按钮适合一个 8 位位域,您可以将 14 字节的 bpackage 缩小为 3 或可能的 4 字节(可能会添加某种框架)。这显然会将使用的带宽减少至少 3 倍(但会使您的程序复杂化。如果一切都适合字节,那么您至少不会遇到平台字节顺序的问题)

通过蓝牙,在接近理想的条件下,您可以期望约 80kbit/s 的带宽。 - 20 * 30 字节/秒应该很容易实现,即使您坚持使用现有的 ASCII 协议。

【讨论】:

  • 确实这似乎不是带宽问题,更可能是延迟问题。发送端的蓝牙驱动程序可能正在等待更多数据,然后才能播放帧。
  • 对。但这不是问题;)我的假设是 OP 想要传输尽可能多的位置数据包 - 即连续数据流。
  • 感谢托弗罗。不幸的是,我对将字符串数据转换为字节并不熟悉。我想我可以只发送一个 0 或 1 来表示按钮状态,并且根据数组中位的位置,我可以确定哪个位代表哪个按钮。但是对于一个 3 位长的数字,我应该查看一个 ascii 表吗?
  • 好吧,我猜你们俩都是对的!足够多的包和最小的延迟。嗯。我认为延迟是我最大的担忧。
  • 如果 延迟 是您要避免的主要问题,您应该专注于 保持字节流继续运行 - 在这种情况下,我会,至少目前,保持您拥有的 ASCII 传输,而不是尝试使数据包更短。一旦你真正看到你使用了太多带宽,你就可以回到这一点。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多