Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Arduino从';char';至';字符*';_C++_Arduino - Fatal编程技术网

C++ Arduino从';char';至';字符*';

C++ Arduino从';char';至';字符*';,c++,arduino,C++,Arduino,这真的让我很难过;这是一个简单的逻辑。我将解释事情的进展,以及我目前正在努力实现的目标 我对ESP8266模块进行了编程,以便在运行Mosquito MQTT服务器的服务器上订阅主题“交换机” 从具有MQTT客户机的任何设备,我都能够将消息发布到此主题(交换机),并使用下面的回调函数通过串行方式发送此消息 void callback(char* topic, byte* payload, unsigned int length) { for (int i = 0; i <

这真的让我很难过;这是一个简单的逻辑。我将解释事情的进展,以及我目前正在努力实现的目标

我对ESP8266模块进行了编程,以便在运行Mosquito MQTT服务器的服务器上订阅主题“交换机”

从具有MQTT客户机的任何设备,我都能够将消息发布到此主题(交换机),并使用下面的回调函数通过串行方式发送此消息

    void callback(char* topic, byte* payload, unsigned int length) { 

    for (int i = 0; i < length; i++) {
       Serial.print((char)payload[i]);
    }
      Serial.println();
    }
到目前为止,一切都很好,但是当我尝试将这个“received_Message”传递给一个函数时,该函数应该返回所发送内容的整数值

const char * Names[] = {"SwitchOne", "SwitchTwo", "SwitchThree", "SwitchFour", "SwitchThirteen"};
const int Numbers[] = {1,2,3,4,13};

int GetNumber(char *name) {
   for (int i=0; i < sizeof Names / sizeof Names[0]; i++) {
       if (strcmp(name, Names[i]) == 0)
            return Numbers[i];
   }
   return -1;  // No match found
}
注意:例如,假设我将发送一条消息“SwitchOne”

mosquitto_pub -t switches -m "SwitchOne"

问题是,我做错了什么?我该如何修复它?提前感谢您的帮助。

编译器错误是因为方法GetNumber需要char*,而收到的消息只是一个char。当您调用GetNumber(“SwitchOne”)时,它会工作;因为“SwitchOne”是一个字符数组


然而,我不认为这是唯一的问题。在代码中,似乎希望received_Message是存储在Names中的字符串之一,但根据它,它只是存储Serial.write(received_bytes)写入的字节数

编译器错误是因为GetNumber方法需要char*,而收到的_消息只是一个char。当您调用GetNumber(“SwitchOne”)时,它会工作;因为“SwitchOne”是一个字符数组


然而,我不认为这是唯一的问题。在代码中,似乎希望received_Message是存储在Names中的字符串之一,但根据它,它只是存储Serial.write(received_bytes)写入的字节数

循环
函数中,
收到的\u消息
应该是
字符*
。老实说,我不知道
GetNumber
做了什么,但它似乎期望一个
char*
作为参数。
charreceived\u Message=Serial.write(received\u字节)
你确定这就是串行写入返回的内容吗?@BartekBanachewicz你是对的char received_Bytes=esp8266.read();串行打印(接收字节);输出“SwitchOne”,如果我使用“GetNumber(“SwitchOne”);”这可以正常工作并返回“1”。其余的“已定义”关键字也是如此。SwitchTwo返回“2”…etcesp8266.read();返回每个字符的ASCII码表示形式。它在
循环
函数中返回类似于“8311910511699104410410511411611011101310”的内容,
接收的\u消息
应该是
字符*
。老实说,我不知道
GetNumber
做了什么,但它似乎期望一个
char*
作为参数。
charreceived\u Message=Serial.write(received\u字节)
你确定这就是串行写入返回的内容吗?@BartekBanachewicz你是对的char received_Bytes=esp8266.read();串行打印(接收字节);输出“SwitchOne”,如果我使用“GetNumber(“SwitchOne”);”这可以正常工作并返回“1”。其余的“已定义”关键字也是如此。SwitchTwo返回“2”…etcesp8266.read();返回每个字符的ASCII码表示形式。它返回类似于“831191051169910048410410511411611011101310”的内容好吧,那么可以用什么替代Serial.write(received_字节)将消息存储为字符数组,这样我就可以将其发送到GetNumber()函数?如果不确切知道esp8622.read()返回的数据的格式,我无法确定。听起来它可能已经返回了一个字符数组,或者至少返回了相同格式的字节。如果是前者调用GetNumber(esp8622.read()),而不是当前在该If语句中的3行,那么如果是后者,一个简单的typecast就可以了。下面是Serial.print(esp8266.read())的输出-1-111610410414101111010我尝试了'int val=GetNumber((char*)esp8266.read());连续打印(val);'我得到了'-1-1-1-1-1-1-1-1-1-1'-esp8266.read()在哪里实现?您正在为它导入库吗?这方面的文件将很有帮助。谷歌搜索似乎esp8622.read()为每个调用返回一个字符,这意味着它应该在循环中调用它来填充一个字符数组,然后用该数组调用GetNumber。仅仅根据您在这里展示的代码示例,我真的不知道发生了什么以及您是如何得到这些结果的。关于C++中的数组和指针,以及它们之间的关系,你知道多少?似乎读一些这方面的内容可以帮助您理解发生了什么。好吧,那么,有什么办法可以替代Serial.write(received_字节)将消息存储为字符数组,以便我可以将其发送到GetNumber()函数?如果不确切知道esp8622.read()返回的数据的格式,我无法确定。听起来它可能已经返回了一个字符数组,或者至少返回了相同格式的字节。如果是前者调用GetNumber(esp8622.read()),而不是当前在该If语句中的3行,那么如果是后者,一个简单的typecast就可以了。下面是Serial.print(esp8266.read())的输出-1-111610410414101111010我尝试了'int val=GetNumber((char*)esp8266.read());连续打印(val);'我得到了'-1-1-1-1-1-1-1-1-1-1'-esp8266.read()在哪里实现?您正在为它导入库吗?这方面的文件将很有帮助。谷歌搜索似乎esp8622.read()为每个调用返回一个字符,这意味着它应该在循环中调用它来填充一个字符数组,然后用该数组调用GetNumber。仅仅根据您在这里展示的代码示例,我真的不知道发生了什么以及您是如何得到这些结果的。关于C++中的数组和指针,以及它们之间的关系,你知道多少?看来读一些这方面的书会帮助你理解
PIO_ESP_Control:6: error: initializing argument 1 of 'int GetNumber(char*)' [-fpermissive]
invalid conversion from 'char' to 'char*' [-fpermissive]
mosquitto_pub -t switches -m "SwitchOne"