Arduino字符串和字符和指针等

ili*_*007 3 c arrays arduino char

我发现自己再次被C字符串,字符等混淆了.

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

我设置一个数组指针3个元素长(3个字节长???我真的不知道):

char *mqtt_command[3] = {};
Run Code Online (Sandbox Code Playgroud)

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

*mqtt_command[i] = str;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

error: invalid conversion from 'char*' to 'char'
Run Code Online (Sandbox Code Playgroud)

如果我改为:

mqtt_command[i] = str;
Run Code Online (Sandbox Code Playgroud)

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

这是我的代码:

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
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

command
range
1
Command: range
MQTT string: c
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解字符,字符串,指针,字符数组吗?我在哪里可以找到关于该主题的全面教程?

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

command:range:1
Run Code Online (Sandbox Code Playgroud)

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

command:range:0
command:digital:8
read:sensor:2
Run Code Online (Sandbox Code Playgroud)

等等

任何帮助将不胜感激.

unw*_*ind 7

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

这个:

char *mqtt_command[3] = {};
Run Code Online (Sandbox Code Playgroud)

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

然后,您的第一个错误是这段代码:

*mqtt_command[i] = str;
Run Code Online (Sandbox Code Playgroud)

编译器抱怨的问题是你要解除引用次数太多次了.就mqtt_command[i]足够了,它评估数组的第i个值,它具有类型char *.然后,您的初始星号取消引用该指针,这意味着左手表达式的类型现在是char,即它是一个单个字符.您不能将指针指定给字符,它(通常)不适合.

删除最初的星号以解决此问题.

为了进一步分析,这个:

char *message_buff = "command:range:1";
String msgString = String(*message_buff);
Run Code Online (Sandbox Code Playgroud)

也是错的,出于同样的原因.你正在取消引用message_buff指针,所以String()构造函数的参数只是第一个字符,即c.再次,删除最初的星号,你的意思是:

String msgString = String(message_buf);
Run Code Online (Sandbox Code Playgroud)

这可以写成:

String msgString(message_buf);
Run Code Online (Sandbox Code Playgroud)