• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego metoda indexOf w Arduino nie działa.

VPS Starter Arubacloud
0 głosów
601 wizyt
pytanie zadane 7 lipca 2017 w Mikrokontrolery przez PelikanFix16 Użytkownik (950 p.)

Witam, chciałbym się zapytać gdzie, może być tutaj błąd, ponieważ wywołując metodę na rzecz string metoda zawsze zwraca -1.

A dany argument znajduje się w łańcuchu.

Może jest jakaś inna metoda na znalezienie danego słowa w łańcuchy ?

#include <SoftwareSerial.h>

const byte rxPin = 2; 
const byte txPin = 3; 
SoftwareSerial esp8266 (rxPin, txPin);
bool sendC(char* cmd,char* rep){
  while(esp8266.available()>0 && esp8266.read()>-1){}
  int i=0;
  while(true){
    esp8266.print(cmd);
    if(esp8266.available() && esp8266.find(rep)){
      Serial.print(i);
      Serial.println(cmd);
      return true;
    }
    i+=1;
    }
}

void setup() {
  Serial.begin(115200);
  esp8266.begin(115200);
  
  if(sendC("AT+RST\r\n","ready") && sendC("AT+CWMODE=1\r\n","OK") && sendC("AT+CIPMUX=1\r\n","OK") && sendC("AT+CIPSERVER=1,80\r\n","OK")){
    Serial.println("SERVER START");
  }
    

  

}

void loop() {
if(esp8266.available()){
String s = String(char(esp8266.read()));
if(s.indexOf("HTTP") != -1){
  Serial.println("FOUND CONNECT");
}
Serial.print(s);

}



}

 

 

A to jest wynik, jaki dostaje na ekran po wgraniu kodu na płytkę.

 

2682AT+RST

31AT+CWMODE=1

207AT+CIPMUX=1

0AT+CIPSERVER=1,80

SERVER START

0,CONNECT

+IPD,0,430;GET / HTTP/1.1
Host: 00.186.213.100
Coneel6e5i9.
e0,CLOSED
0,CONNECT

+IPD,0.430:GET / HTTP/1.1
Host: 10.186.213.110
Cone-z6G3oatnn1,COONECT

+IPD,1,430:GET / HTTP/1.1
Host: 10.186/213.110
C⸮˫⸮
Iix 5n/na00,CLOSED
0,CONNECT

+IPD,0,430:GET / HTTP/1.1
Host: 10.186.213/110
ConacaAotwtn,1,CLOSED
0,CLOSED

 

1 odpowiedź

+1 głos
odpowiedź 7 lipca 2017 przez Bondrusiek Maniak (61,370 p.)

Cześć,

trochę niedokładnie opisałeś swój problem. Powinieneś bardziej opisać co ten program robi i co wykorzystujesz. Wydaje mi się że tu jest błąd:

String s = String(char(esp8266.read()));

Rzutujesz rezultat metody read() na char. Typ char(https://www.arduino.cc/en/Reference/String) najczęściej przechowuje jeden bajt tzn, że może przechować tylko jeden znak jak np. 'a', 'b', '4', '6' czy 'y'. Po tej operacji chcesz porównać tą wartość do "HTTP'. Jak widać niemożliwe do zrobienia. Spróbuj tak(usuń char). Może to pomoże.

String s = String(esp8266.read());

Pozdrawiam.

komentarz 7 lipca 2017 przez PelikanFix16 Użytkownik (950 p.)

Po usunięciu char() odpowiedz po zalogowaniu się do modułu mam taką.

Kody ASCII znaków.

901AT+RST

39AT+CWMODE=1

1AT+CIPMUX=1

0AT+CIPSERVER=1,80

SERVER START
13
10
48
44
67
79
78
78
69
67
84
13
10
13
13
43
73
80
68
44
48
44
52
48
52
58
71
68
84
32
47
32
72
84
84
80
47
49
46
48
13
10
72
111
115
116
58
32
49
48
47
49
56
54
46
50
49
51
46
49
49
48
12
10
67
111
110
110
58
98
97
97
65
76
49
44
67
79
78
78
69
67
84
13
10

 

komentarz 7 lipca 2017 przez Bondrusiek Maniak (61,370 p.)

Tak,

ale nie możesz dalej porównać

if(s.indexOf("HTTP") != -1){
  Serial.println("FOUND CONNECT");
}

bo funkcja read() zwraca char a Ty przyrównujesz do string'a.

https://www.arduino.cc/en/Reference/SoftwareSerialRead

Możesz np. dać taki warunek

if(s.indexOf('H') != -1)
{ Serial.println("FOUND CONNECT"); }

 

komentarz 7 lipca 2017 przez PelikanFix16 Użytkownik (950 p.)

Zmieniłem kod.

void loop() {
if(esp8266.available()){
String s = String(esp8266.read());
if(s.indexOf('H') != -1)
{ Serial.println("FOUND CONNECT"); 
}

Serial.println(s);

}



}

 

Ale rezultat po wykonaniu ciągle taki sam .

1779AT+RST

11AT+CWMODE=1

1AT+CIPMUX=1

0AT+CIPSERVER=1,80

SERVER START
13
10
48
44
67
79
78
78
69
67
84
13
10
13
10
43
73
80
68
44
48
44
51
55
50
58
71
69
84
32
47
32
72
84
84
80
47
49
46
49
13
10
72
111
115
116
58
32
49
48
46
49
56
54
46
50
48
51
46
49
49
48
13
10
85
112
103
32
111
97
32
99
49
58
10
49
44
67
79
78
78
69
67
84
13
10
13
13
41
145
80
66
46
48
44
51
147
38
58
21
84
48
9
66
81
81
65
189
138
114
138
106
10
72
111
115
116
58
32
49
48
46
49
56
54
46
50
76
38
41
138
130
106
10
85
112
103
114
96
100
101
45
73
110
115
101
99
117
114
101
44
82
115
97
103
95
77
56
101
101
48
38
40
234
106
21
68
131
13

 

komentarz 7 lipca 2017 przez Bondrusiek Maniak (61,370 p.)

A co Ci ma zwrócić esp8266.read() aby było OK. Ja podałem tylko przykład związany z kodem tzn że char zwraca tylko jeden znak oraz podałem że jak możesz przykładowo to przypisać np do 'h'. Ja nie znam biblioteki  SoftwareSerial.h . Ty musisz dokładnie odczytać co musi zwrócić a nie przepisywać co Ci podałem. Musisz dopasować własne dane. Zaobserwuj co zwraca esp8266.read()

Serial.println(esp8266.read());

komentarz 7 lipca 2017 przez PelikanFix16 Użytkownik (950 p.)

Znaczy, chodziło mi o to, by móc wyjmować dane z tego, co przesyła esp na arduino, a następnie odpowiednio modyfikować kod arduino w zależności co przęśle esp.

void loop() {
if(esp8266.available()){
String s = String("0"+esp8266.read());

if(s.indexOf("HTTP") != -1){
  Serial.println("CONNECTED");
}

}



}

 

 

Takie rozwiązanie zaczęło działać. Po połączeniu się do modułu warunek zostaje spełniony.

 

komentarz 7 lipca 2017 przez Bondrusiek Maniak (61,370 p.)
To spoko, że już działa.

Podobne pytania

0 głosów
1 odpowiedź 3,450 wizyt
pytanie zadane 22 lutego 2016 w Mikrokontrolery przez programer Obywatel (1,190 p.)
0 głosów
0 odpowiedzi 216 wizyt
pytanie zadane 25 listopada 2020 w Mikrokontrolery przez Kacper33662 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 267 wizyt
pytanie zadane 10 lutego 2019 w Mikrokontrolery przez Wonderpol Gaduła (3,730 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...