Строка с тем же содержимым, но сравнение всегда возвращает false - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующий код, в котором с помощью библиотеки WiFi я выполняю сканирование доступных сетей Wi-Fi и хочу определить, доступна ли определенная сеть c. Я использую ESP32 и Arduino IDE. Обработка памяти EEPROM, кажется, работает, но я не понимаю, почему сравнение всегда возвращает ноль.

SSID = EEPROM.readString(500); // I read from eeprom the string stored in pos 500 
WiFi.mode(WIFI_STA);
delay(100);
Serial.println(logg + "SCAN!");
int n = WiFi.scanNetworks();
Serial.println(logg + "SE DETECTARON: " + String(n) + " REDES WIFI!");
for (int i = 0; i < n; ++i) {
    // Print SSID and RSSI for each network found
    Serial.println("'" + WiFi.SSID(i) + "' vs '" + SSID + "' SizeOf: " + String(WiFi.SSID(i).length()) + " - " + String(SSID.length()) + " Comparacion " + String(WiFi.SSID(i) == SSID );
}

delay(10);

На последовательном мониторе я получаю следующее:

' WRT1900A C 2,4 ГГц против WRT1900A C 2,4 ГГц. Размер: 16–16 Сравнение 0

Две строки выглядят одинаково, они одного размера. Я уже пробовал заменить компаратор «==» на strcmp и получил -244.
Я также пробовал использовать .c_str следующим образом:

WiFi.SSID(i).c_str() ==  SSID.c_str()

, но с теми же результатами. Если кто-то что-нибудь придумает, буду очень признателен.

1 Ответ

0 голосов
/ 07 мая 2020

Две струны выглядят одинаково, они одного размера.

Хотя WiFI.SSID() возвращает объект String, он не обязательно должен быть в кодировке ASCII. Кодировка строки зависит от настройки локали маршрутизатора, и причина, по которой она выглядит так же, заключается в том, что Serial.print() преобразует ее в ASCII. Это может быть доказано в следующем эскизе с использованием как Serial.print(), так и Serial.printf() в ESP32, который показывает, что фактически получено (Serial.printf(), однако, не поддерживает форматирование Unicode в реализации ESP32, поэтому будет производить некоторые символы мусора).

int n = WiFi.scanNetworks();
for (int i=0; i<n; i++) {
  // Serial.print() will cast the WiFi.SSID() to ASCII
  Serial.print(WiFi.SSID(i));    
  // this shown what WiFi.SSID() truly return
  Serial.printf(" --- %s\n", WiFi.SSID(i)); 
}

Результат будет показан на этом рисунке. Как вы можете видеть, некоторые SSID дают правильные результаты, но некоторые отображаются как мусор.

enter image description here

Таким образом, оператор сравнения строк выполняет свою работу правильно при сравнении WiFi.SSID(i) == SSID и результат действительно не обязательно должен быть одинаковым для некоторого SSID, даже если он "выглядит" одинаково для человека.

Итак, как решить эту проблему? Если вы хотите рассматривать их «как одно и то же», по иронии судьбы, преобразование объекта String в массив символов с помощью .c_str() действительно выполняет свою работу, поскольку оно преобразует каждый символ в ASCII. Думаю, вы просто неправильно использовали сравнение массивов символов strcmp () .

 if(strcmp(WiFi.SSID(i).c_str(), SSID.c_str()) == 0) {
   // match
 }
 else {
   // not match
 }

Если вы говорите, что это сравнение c .str () возвращает -244, затем отредактируйте свой вопрос и сделайте Serial.printf() на обоих String или лучше на l oop через символ String по уставу и распечатайте HEX-код, чтобы увидеть, что происходит.

...