Sim*_*Son 2 c++ string esp8266 arduino-esp8266
我绝望了!我希望我的ESP8266从TCP客户端接收一个字符串,执行相应的函数并给出TCP响应.但不幸的是,响应字符串以某种奇怪的方式被破坏:假设我输入了一个'未知命令',前11个字节通过串行接口正确打印(其余是转储),客户端收到的前11个字节是转储,但其余的都是正确的(见下面脚本中的评论).但是当我输入'dim'命令时,结果是正确的(但返回字符串也比"error:unknown command"短).目前我完全不知道如何解决这个问题,即使我已经尝试了很多.
#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <string.h>
struct parsed_query{
String command;
String arguments;
};
struct parsed_query parser(void){
// this function receives and parses a query
struct parsed_query result;
result.command="entered command";
result.arguments="entered arguments"
return result
}
char* str2char(String as_string){
int i_0=0;
while(as_string[i_0]!='\0'){i_0++;}
char as_char[i_0+1];
as_char[i_0]='\0';
for(int i=0;i<i_0;i++){
as_char[i]=as_string[i];
}
return as_char;
}
String executor(String command,String arguments){
String response;
if(command=="dim"){
response="dimming";
}
else if(command=="on"){
response="switching ON";
}
else{
response="error: unknown command";
}
return response;
}
void setup(){
// initialize serial interface, wifi & tcp-server
Serial.begin(115200);
WiFi.begin("<SSID>","<PASSWORD>");
while (WiFi.status() != WL_CONNECTED){delay(500);}
TCPserver.begin();
}
void loop() {
if(!client.connected()){
client=TCPserver.available();
}else{
struct parsed_query query=parser();
// This prints "error: unkno??*/???*??"
Serial.println(str2char(executor(query.command,query.arguments)));
// here, the client receives "????**?*??*?wn command"
client.write(str2char(executor(query.command,query.arguments))));
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个想法可能导致这个结果(即使我不知道在我的代码中修复它的位置):
案例1:也许,我在某些时候将参考调用和值调用联系起来(如果是的话,在哪里?)
案例2:我的程序导致堆栈溢出(如果是,在哪里?)
任何帮助高度赞赏,因为我不想再花一晚.
在str2char您返回指向本地数组的指针时,但是像每个局部变量一样,它在函数返回后不再存在.因此从返回的指针读取会导致未定义的行为.
编译并启用警告(强烈建议)应输出如下内容:
警告:返回本地变量'as_char'的地址