[esp8266-arduino ide code] - verlies deel string

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 11-10 22:50
Ik heb een raar probleem met wat programmatuur op de esp (arduino ide):

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
String feedbackventil;
int empty_statusOLD = 5;
int empty_status ;
#define emptyled 12
boolean debug = false; // om te testen

void loop() {
...//wat andere code
empty_status = digitalRead(emptyled);
if (empty_statusOLD != empty_status) {
    feedbackventil = "stwz_empty_status=" + empty_status;
    infoverzenden(feedbackventil); //update doorsturen
    empty_statusOLD = empty_status;
  }
....//nog wat andere code
}
void infoverzenden(String url) {

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (!client.connect(host, httpPort)) {
     if (debug) {Serial.println("connection failed");}
    return;
  }
  // We now create a URI for the request
  url = "/test/ventilkab.php?mess=" + url;  // het volledige adres maken van dit deel
  
  if (debug) {
    Serial.print("Requesting URL: ");
    Serial.println(url);
   }
   // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  if (debug) {
    delay(500);
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
    Serial.println();
    Serial.println("closing connection");
 }
   
}


waarbij het php script de waarde van mess gaat uitlezen en verwerkt zoals hieronder
PHP:
1
2
3
if (isset($_GET["mess"])) {
    $opdr=$_GET["mess"];
}

Maar blijkbaar mis ik 1 of 2 chars van de var mess? dus "twz_empty_status=0" of "wz_empty_status=0" ipv "stwz_empty_status=0"
Iemand enig idee wat er misgaat? (rare is dus soms 1 en soms 2 chars die verdwijnen?)
Als ik de debug var op true zet en het uitlees via serieel dan is de var feedbackventil wel volledig.

[ Voor 0% gewijzigd door RobIII op 14-04-2016 21:31 . Reden: Syntax highlighting FTW! ]

Beste antwoord (via Promy op 16-04-2016 08:36)


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-10 19:15
rvtk schreef op donderdag 14 april 2016 @ 22:08:
Zie ook de reference van StringAddtionOperator".
Je hebt wel gelijk, maar de uitleg op de pagina die je linkt is bar slecht.

Het probleem is natuurlijk dat een string constant een pointer naar een (array van) characters is, en als je daar een integer bij optelt, verschuif je simpelweg de pointer. Dus "foo" + 1 == "oo".

Vandaar dat je eerst de string naar een String object moet converteren: (String)"foo" + 1 == "foo1".
C:
1
"I want " + analogRead(A0) + " donuts"


This won't compile because the compiler doesn't handle the operator precedence correctly.
Het heeft niets met operator precedence te maken. a + b + c evalueert gewoon als ((a + b) + c). Het probleem is dat je geen char*s kan optellen.

tl;dr: je zou regel 11 ook kunnen schrijven als:
C++:
1
feedbackventil = String("stwz_empty_status=") + empty_status;

Maar probeer alsjeblieft te doorgronden hoe C++ werkt. Dan kun je dit soort problemen in het vervolg zelf oplossen.

[ Voor 12% gewijzigd door Soultaker op 16-04-2016 00:27 ]

Alle reacties


Acties:
  • +1 Henk 'm!

  • rvtk
  • Registratie: Juni 2001
  • Laatst online: 10-10 22:08
Ik zou op regel 26 een nieuwe String aanmaken ipv de variabele url hergebruiken. Of dit het oplost weet ik niet, maar het is in ieder iets netter en makkelijk te proberen.

<edit>
Ik denk dat ik je probleem heb gevonden. Probeer eens regel 11 op te schrijven in 2 regels:
C:
1
2
feedbackventil = "stwz_empty_status=";
feedbackventil = feedbackventil + empty_status;

Zie ook de reference van StringAddtionOperator".
Caution: You should be careful about concatenating multiple variable types on the same line, as you may get unexpected results.

[ Voor 57% gewijzigd door rvtk op 14-04-2016 22:17 ]


Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 11-10 22:50
Net eens kort getest en het lijkt inderdaad het probleem op te lossen. Nu nog wat verder testen :)

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-10 19:15
rvtk schreef op donderdag 14 april 2016 @ 22:08:
Zie ook de reference van StringAddtionOperator".
Je hebt wel gelijk, maar de uitleg op de pagina die je linkt is bar slecht.

Het probleem is natuurlijk dat een string constant een pointer naar een (array van) characters is, en als je daar een integer bij optelt, verschuif je simpelweg de pointer. Dus "foo" + 1 == "oo".

Vandaar dat je eerst de string naar een String object moet converteren: (String)"foo" + 1 == "foo1".
C:
1
"I want " + analogRead(A0) + " donuts"


This won't compile because the compiler doesn't handle the operator precedence correctly.
Het heeft niets met operator precedence te maken. a + b + c evalueert gewoon als ((a + b) + c). Het probleem is dat je geen char*s kan optellen.

tl;dr: je zou regel 11 ook kunnen schrijven als:
C++:
1
feedbackventil = String("stwz_empty_status=") + empty_status;

Maar probeer alsjeblieft te doorgronden hoe C++ werkt. Dan kun je dit soort problemen in het vervolg zelf oplossen.

[ Voor 12% gewijzigd door Soultaker op 16-04-2016 00:27 ]


Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 11-10 22:50
@Soultaker: ik had me gebaseerd op de uitleg op arduino website, maar met je verhelderende uitleg komt er inderdaad iets terug over die pointers (uit lang vervlogen lessen programmeren in java) en is die String("inhoud") ook duidelijk!

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 11-10 16:49
Promy schreef op zaterdag 16 april 2016 @ 09:12:
@Soultaker: ik had me gebaseerd op de uitleg op arduino website, maar met je verhelderende uitleg komt er inderdaad iets terug over die pointers (uit lang vervlogen lessen programmeren in java) en is die String("inhoud") ook duidelijk!
Ik ging in het begin ook onderuit door de crappy uitleg op de Arduino site. Inmiddels weet ik wel beter en zoek ik op andere plekken (stackoverflow en gewoon algemene C++ documentatie en uitleg)
Pagina: 1