【问题标题】:Arduino strings and chars and pointers and suchArduino字符串、字符和指针等
【发布时间】:2013-01-04 09:34:02
【问题描述】:

我发现自己又被 C 字符串、字符等弄糊涂了。

这是我用来在 Arduino 上测试语法的一些代码。我知道 (*message)buff 会给我一个指针(我仍然不知道为什么我需要使用指针,但我可以对此进行一些研究!),我将 *message_buff 转换为字符串(仅用于有事可做,但请注意,稍后当我尝试将此字符串打印到串行时,我只会得到一个“c”字符)。

我设置了一个数组指针,长度为三个元素(三个字节长??我真的不知道):

char *mqtt_command[3] = {};

稍后当我尝试使用以下方法向数组添加值时:

*mqtt_command[i] = str;

我得到错误:

错误:从 'char*' 到 'char' 的无效转换

如果我将其更改为:

mqtt_command[i] = str;

(没有 *)它编译得很好。不知道为什么……

这是我的代码:

char *message_buff = "command:range:1";
char *str;
String msgString = String(*message_buff);
char *mqtt_command[3] = {};
int i = 0;

void setup()
{
  Serial.begin(9600);
  delay(500);

  while ((str = strtok_r(message_buff, ":", &message_buff)) != NULL)
  {
    Serial.println(str);
    mqtt_command[i] = str;
    i++;
  }

  delay(1000);

  Serial.print("Command: ");
  Serial.println(mqtt_command[1]);

  Serial.print("MQTT string: ");
  Serial.println(msgString);
}

void loop()
{
  // Do something here later
}

这是输出:

command
range
1
Command: range
MQTT string: c

如何理解字符、字符串、指针和字符数组?我在哪里可以找到关于该主题的全面教程?

我通过MQTT传入一个命令字符串(我认为是字符串,也许是char数组????),消息是:

command:range:1

我正在尝试构建一个小协议,以便在收到 MQTT 消息时在 Arduino 上执行操作。我可以很好地处理 MQTT 回调,这不是问题。问题是我不太了解 C 字符串和字符。我希望能够处理以下命令:

command:range:0
command:digital:8
read:sensor:2

等等

【问题讨论】:

  • 获取并阅读一本关于 C 的好书。
  • 在真正的计算机上学习 C,然后再尝试了解在哈佛架构微控制器上工作的额外复杂性。

标签: c arrays char arduino


【解决方案1】:

您首先需要 C(和/或 C++)入门,您需要更多地了解声明和指针访问的语法等。

这个:

char *mqtt_command[3] = {};

表示“mqtt_command 是一个由 3 个char * 组成的数组”,即三个指向字符的指针。由于字符串表示为指向字符的指针,因此可以将其称为“三个字符串的数组”。但是,角色本身并没有实际的 空格,所以这还不够,但这是一个好的开始。

那么,你的第一个错误就是这段代码:

*mqtt_command[i] = str;

编译器抱怨的问题是你取消引用的次数太多了。只需mqtt_command[i] 就足够了,它计算为数组的第 i:th 值,其类型为char *。然后,您的初始星号 dereferences 该指针,表示左侧表达式的类型现在是 char,即它是单个字符。您不能将指针分配给字符,它(通常)不适合。

去掉最初的星号来解决这个问题。

为了进一步分析,这个:

char *message_buff = "command:range:1";
String msgString = String(*message_buff);

也是错误的,出于同样的原因。您正在取消引用message_buff 指针,因此String() 构造函数的参数只是第一个字符,即c。同样,去掉最初的星号,你的意思是:

String msgString = String(message_buf);

可以写成:

String msgString(message_buf);

【讨论】:

  • 非常感谢 - 你有什么好的固体 C 底漆的指针(不是双关语)吗?
  • 对于 C 的快速介绍(尤其是数组/字符串/字符),我建议使用“Head First C”amazon.com/Head-First-C-David-Griffiths/dp/1449399916/…
  • 好酷 - 我读过其他 Head First 书籍,它们非常好。我会试一试的。
  • 我还推荐 Harbison & Steele 的 C: A Reference Manual 作为配套参考。
【解决方案2】:
mqtt_command[i] = str;

这会起作用,因为mqtt_command[i] 已经是字符指针。 * 会将其重定向到任何先前分配的内存,这在代码中没有完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多