Arduino/C char 构造产生垃圾
Arduino/C char construction generates trash
我有以下代码(片段):
void readEeprom(){
int lenPass = int(EEPROM.read(0));
int lenSsid = int(EEPROM.read(1));
char password2[lenPass];
char ssid2[lenSsid];
for(int i = 0; i < lenPass; i++){
password2[i] = char(EEPROM.read(i+2)) ;
Serial.println(password2);
};
Serial.print(":");
for(int i = 0; i < lenSsid; i++){
ssid2[i]= char(EEPROM.read(i+lenPass+2));
Serial.println(ssid2);
};
Serial.println("password2: " + String(password2));
Serial.println("ssid2: " + String(ssid2));
WiFi.begin(ssid2, password2);
};
这是一个 Arduino/C 代码,应该从内部 EEPROM 中读取一些配置并连接到 WiFi(它是一个 ESP8266 模块 (wemos D1 mini))。
但是,读取工作正常,这是我通过串行控制台获得的结果:
T
Tk
TkP
TkPw⸮⸮⸮?⸮⸮⸮?$ @⸮⸮⸮?
TkPwm⸮⸮?⸮⸮⸮?$ @⸮⸮⸮?
TkPwmh⸮?⸮⸮⸮?$ @⸮⸮⸮?
TkPwmhu?⸮⸮⸮?$ @⸮⸮⸮?
TkPwmhuj⸮⸮⸮?$ @⸮⸮⸮?
TkPwmhujr⸮⸮?$ @⸮⸮⸮?
TkPwmhujrs⸮?$ @⸮⸮⸮?
TkPwmhujrs$?$ @⸮⸮⸮?
:W
WL
WLA
WLAN⸮⸮⸮?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-⸮⸮?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-U⸮?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ul?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ull⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ullr⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ullri⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ullric?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-UllrichPt @TkPwmhujrs$?$ @⸮⸮⸮?
password2: TkPwmhujrs$?$ @⸮⸮?
ssid2: WLAN-UllrichPt @TkPwmhujrs$?$ @⸮⸮?
如您所见,password2
和 ssid2
字符数组的构造产生了垃圾,连接无法正常工作。
任何人都可以理解并帮助我吗?
C 中的 char 数组中的字符串必须以 null 结尾,以便像 print 这样的函数知道它们在哪里结束。现在您设置了一个名为 password2 的数组,其长度为一定长度(您没有显示所有代码所以谁知道)。它被分配到内存中,并且充满了那些内存位置中遗留下来的垃圾。然后你读取一个字符并添加到第一个插槽并告诉它打印整个数组。你看到了什么?您会看到您添加的一个字符后跟数组中的所有垃圾。添加第二个和第三个字符后,情况相同,依此类推。你必须在字符串的末尾放置一个空的 '\0' 来告诉打印函数有用部分在哪里结束,这样它就不会打印整个数组,而只会打印你已经填充的部分。
for(int i = 0; i < lenPass; i++){
password2[i] = char(EEPROM.read(i+2)) ;
password2[i+1] = '[=10=]';
Serial.println(password2);
};
我有以下代码(片段):
void readEeprom(){
int lenPass = int(EEPROM.read(0));
int lenSsid = int(EEPROM.read(1));
char password2[lenPass];
char ssid2[lenSsid];
for(int i = 0; i < lenPass; i++){
password2[i] = char(EEPROM.read(i+2)) ;
Serial.println(password2);
};
Serial.print(":");
for(int i = 0; i < lenSsid; i++){
ssid2[i]= char(EEPROM.read(i+lenPass+2));
Serial.println(ssid2);
};
Serial.println("password2: " + String(password2));
Serial.println("ssid2: " + String(ssid2));
WiFi.begin(ssid2, password2);
};
这是一个 Arduino/C 代码,应该从内部 EEPROM 中读取一些配置并连接到 WiFi(它是一个 ESP8266 模块 (wemos D1 mini))。
但是,读取工作正常,这是我通过串行控制台获得的结果:
T
Tk
TkP
TkPw⸮⸮⸮?⸮⸮⸮?$ @⸮⸮⸮?
TkPwm⸮⸮?⸮⸮⸮?$ @⸮⸮⸮?
TkPwmh⸮?⸮⸮⸮?$ @⸮⸮⸮?
TkPwmhu?⸮⸮⸮?$ @⸮⸮⸮?
TkPwmhuj⸮⸮⸮?$ @⸮⸮⸮?
TkPwmhujr⸮⸮?$ @⸮⸮⸮?
TkPwmhujrs⸮?$ @⸮⸮⸮?
TkPwmhujrs$?$ @⸮⸮⸮?
:W
WL
WLA
WLAN⸮⸮⸮?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-⸮⸮?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-U⸮?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ul?⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ull⸮⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ullr⸮⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ullri⸮?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-Ullric?Pt @TkPwmhujrs$?$ @⸮⸮⸮?
WLAN-UllrichPt @TkPwmhujrs$?$ @⸮⸮⸮?
password2: TkPwmhujrs$?$ @⸮⸮?
ssid2: WLAN-UllrichPt @TkPwmhujrs$?$ @⸮⸮?
如您所见,password2
和 ssid2
字符数组的构造产生了垃圾,连接无法正常工作。
任何人都可以理解并帮助我吗?
C 中的 char 数组中的字符串必须以 null 结尾,以便像 print 这样的函数知道它们在哪里结束。现在您设置了一个名为 password2 的数组,其长度为一定长度(您没有显示所有代码所以谁知道)。它被分配到内存中,并且充满了那些内存位置中遗留下来的垃圾。然后你读取一个字符并添加到第一个插槽并告诉它打印整个数组。你看到了什么?您会看到您添加的一个字符后跟数组中的所有垃圾。添加第二个和第三个字符后,情况相同,依此类推。你必须在字符串的末尾放置一个空的 '\0' 来告诉打印函数有用部分在哪里结束,这样它就不会打印整个数组,而只会打印你已经填充的部分。
for(int i = 0; i < lenPass; i++){
password2[i] = char(EEPROM.read(i+2)) ;
password2[i+1] = '[=10=]';
Serial.println(password2);
};