【问题标题】:Weird output for RGBRGB的奇怪输出
【发布时间】:2020-11-07 00:38:46
【问题描述】:

我正在尝试使用蓝牙 + Adafruit NeoPixel 在我的移动设备上管理一些 LED 灯条。我几乎完成了草图,但我发现 RGB 的数字没有像我预期的那样出现,我找不到我做错了什么。

想象一下,我从我的手机发送了以下 RGB 代码“0,19,255”,当我检查控制台时,我看到以下结果:

如您所见,前两行没问题,但第三行我们可以看到 2550。0 不应该在那里,我无法弄清楚问题所在。

所以我决定隔离代码并尽量保持最低限度来确定根本原因,这就是代码:

#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>

SoftwareSerial BT (10, 11);

#define PIN        2
#define NUMPIXELS 144

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRBW + NEO_KHZ800);

int red = "";

void setup() {
  Serial.begin(9600);
  Serial.println("Ready");
  BT.begin(38400);
  pixels.begin();           
  pixels.show();           
  pixels.setBrightness(20);
}

void loop() {
    while (BT.available()>0){
        red = BT.parseInt();
        Serial.println(red);
  }
}

【问题讨论】:

  • String red = ""; red = BT.parseInt(); 除非我弄错了,否则parseInt 返回一个int 而不是字符串。
  • @kaylum 哎呀,你是对的。我已更改,但问题仍然存在。
  • 是否有可能在接收“21”和“19”之间接收到两个数字“255”和“0”并且它们被解析为“2550”?您能否以某种方式确保数字被单独解析,例如发送一些 arduino 期望但忽略的东西。比如发送“0X”、“21X”、“255X”、“0X”、“19X”、“255X”。这将允许将稍微太慢的 arduino 与移动设备发送的内容同步。
  • 看起来 255 和 0 之间没有分隔符:0,21,2550,19,255
  • @zdf 你是一个比我更敏锐的观察者/读者。我建议做一个答案。

标签: c++ arduino led


【解决方案1】:

您描述了您通过移动设备“0,19,255”发送的显示输出。
然而,在显示的输出中,这显然只是发送的较长数字序列的第二部分,以“0,21”开头。

假设您发送的始终是您所描述的格式,即三个数字,用两个“,”分隔,显示的输出很可能是您先发送“0,21,255”然后再发送一个三元组的结果0,19,255"。

这两条消息一起最终会出现在输入缓冲区“0,21,2550,19,255”中。

现在我必须做一些推测。大多数解析器在被告知在缓冲区中查找数字时,会先查找数字,然后再查找非数字。他们最终会产生“0,21,2550”。

如果不了解解析器的工作细节,很难说出如何解决您的问题。
但是,我肯定会尝试发送以非数字结尾的三元组。

例如:

“0,21,255,”

“0,21,255”

"0,21,255;"

如果它们都不起作用,您可能需要明确地期望非数字,即在三元组数字之间读取一个字符并忽略它或将其与“,”、“”或“;”进行比较了解其他自检功能。

(写这篇文章我依赖用户 zdf 不打算做出回答,因为虽然我确实将“2550”发现为“255”“0”,但 zdf 在问题正文中发现了仅有的两个“”在示例输入中,我错过了。我当然会根据 zdf 创建的答案调整我的答案,以在未经他们同意的情况下使用他们的贡献。)

【讨论】:

  • @zdf 如果/当您创建答案并希望我更改我的答案时,请告诉我。
  • 我对你的回答很好。 :0)
  • 我遵循了您给出的想法并且它有效!谢谢大家的精彩回答!
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 2021-12-03
  • 2015-02-18
  • 2011-06-14
  • 2013-06-04
  • 2021-02-08
  • 2014-12-27
  • 1970-01-01
相关资源
最近更新 更多