【问题标题】:sscanf in arduino is only catching last intarduino 中的 sscanf 只捕获最后一个 int
【发布时间】:2015-09-02 03:19:32
【问题描述】:

我正在尝试通过串行端口将一些数字从我的计算机发送到我的 arduino,并且我正在使用 sscanf 来解析字符串中的数字。检测系统工作正常,但由于某种原因 sscanf 仅从消息中获取最后一个数字。下面是失败的代码。 Red、Green 和 Blue 是 uint8_t 变量。

else if (sscanf(message, "(%u, %u, %u)\n", &red, &green, &blue) == 3)
  {
    sprintf(debug, "got (%d, %d, %d)\n", red, green, blue);
    Serial.println(message);
    Serial.print(debug);

如果我发送“(1, 2, 3)”,此代码将运行并打印以下内容

(1, 2, 3)

got (0, 0, 3)

为什么只解析最后一个数字?

编辑

下面是其余的串口读取代码

while (Serial.available() > 0)
{
  message[str_postion] = Serial.read();
  if (message[str_postion] == '\n')
  {
    message[str_postion + 1] = '\0';
    str_postion = 0;
    if (message[0] == 'T')
    {
      Serial.print("GREEN!\n");
    }
    else if (sscanf(message, "(%d, %d, %d)\n", &red, &green, &blue) == 3)
    {
      sprintf(debug, "got (%d, %d, %d)\n", red, green, blue);
      Serial.println(message);
      Serial.print(debug);
      target_color[0] = red;
      target_color[1] = green;
      target_color[2] = blue;
    }
    else
    {
      Serial.print("PARSE\n");
    }
  }
  else
  {
    str_postion++;
  }
}

【问题讨论】:

  • 可能你的错误在其他地方。我尝试了你的代码(我刚刚删除了格式字符串末尾的\n,因为我必须测试另一个字符,因为我的模拟串行监视器做了不支持新行)并且它按预期工作(当我发送(1, 2, 3)got (1, 2, 3))。尝试向我们展示您的阅读功能

标签: arduino serial-port arduino-ide


【解决方案1】:

问题在于我用于颜色变量的数据类型。出于某种原因,sscanf 不喜欢 uint8_t,当我将它们切换到 uint16_t 时它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2016-04-18
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多