Mit dieses Funktion möchte ich 50 mal einen Vorgang auf einem Arrduino
auslösen. Der wertet dann eine bestimmte Zeit einen analogen Eingang aus
und schickt dann ein "Gut" (1) oder ein "Schlecht" (0) zurück. Mit
diesem Ergebnis sollen dann Punkte grün oder rot gefärbt werden.
Ich habe aber die Vermutung, dass das Script zu schnell ist. Wenn ich
das so ausführe wird gar nichts gefärbt aber wenn ich das z.B. mit
Firefox debugge dann werden die Kreise gefärbt.
Ich habe schon versucht mir die Frequenz (max. 20 Hz) vom Arduino vorher
zu holen und damit dann ein setTimeout zu machen aber das hilft auch
irgendwie nicht. In "timeToWait" steht dann gerne mal nichts drin, also
eine 0.
Ich hoffe hier ist jemand der mir dabei helfen kann das Problem zu
lösen.
MfG Kilian
setTimeout() erwartet doch eigentlich eine JS-Funktion und die Wartezeit
in ms als Parameter? Du scheinst es hier als ne Art Sleep() nutzen zu
wollen - Das wird so vermutlich gar keinen Effekt haben?
Außerdem läuft deine for-Schleife bereits, wenn die Antwort von
getfrequency noch gar nicht angekommen sein dürfte und timeToWait wird
zunächst dann den Standardwert 0 haben.
request.send() arbeitet nicht synchron! D.h. der nachfolgende JS-Code
läuft direkt weiter und die frequencyComplete-Funktion wird erst
"mittendrin" aufgerufen, sobald die Antwort vom Server da ist.
Falls du nicht wirklich alles Löw-Level machen willst, Les dich mal hier
ein:
http://www.w3schools.com/jquery/jquery_ajax_intro.asp
Da sind viele der JS-Gemeinheiten versteckt.
Hier schon mal was zum durchknobeln:
<divid="div1"><h2>Let jQuery AJAX Change This Text</h2></div>
21
22
<button>Get External Content</button>
23
24
</body>
25
</html>
Wichtig für's Verständnis: $() selektiert Element aus deiner Seite.
"#div1" z.B. das Element mit der Id "div1" (Achtung Id und Name eines
Elements sind Unterschiedliche Dinge).
Zu deinem Problem: AJAX ist asynchron (sonst würde es SJAX gennant
werden), d.h. der Arduino darf sich mit der Antwort auf getfrequency
ruhig Zeit lassen und dann Antworten. Innerhalb des gleichen
TCP-/http-/... Requests. Ich gehe mal davon aus, daß auf dem Arduino ein
rudimentärer http-Server läuft. Wenn nicht, dann hat JS im Browser eh
wenig Chancen.
Erstmal danke für eure Antworten!
Carl D. schrieb:> Ich gehe mal davon aus, daß auf dem Arduino ein> rudimentärer http-Server läuft. Wenn nicht, dann hat JS im Browser eh> wenig Chancen.
Jap auf dem Arduino läuft der lwIP Stack mit einem Webserver.
Da ich aber leider noch nicht so in Javascript bewandert bin, fällt mir
so jetzt nicht wirklich eine Lösung ein :/ Wie könnte ich das denn
umschreiben damit z.B. alles nach einer Antwort vom Arduino weiter
abgearbeitet wird?
Wenn du aber ernsthaft was mit Web-Oberflächen machen willst, dann
solltest du dich in das "asynchrone" Konzept von JS/WebBrowser
einarbeiten. Probier mal den Code aus dem jquery Tutorial (siehe oben)
aus. Ersetze in der Zeile:
$("#div1").load("demo_test.txt", function(responseTxt, statusTxt, xhr){
die URL "demo_test.txt" durch deine "/getfrequency/id=...", dann sollte
bei Knopfdruck das JSON-Ergebnis auf dem Browser auftauchen.
Mit deinem sleep machst du die ganze Browser-UI kaput, nennt sich auch
"busy wait" und krallt sich einen CPU-Core.
Kilian K. schrieb:> meine eigene sleep Funktion geschrieben.
Das ist aber nicht der richtige Ansatz. Besser ist so lange warten mit
dem senden des nächsten Requests bis die Antwort vom vorherigen Request
eingetroffen ist.
ah... Fehler entdeckt: getTestTableValues() soll natürlich im else-Zweig
der if(i < 50) Abfrage stehen, nicht einfach am Ende der startTest()
Funktion.
1
if(i<50){
2
/* noch nicht alle tests durch? Dann nächster Test */
beric schrieb:> Das ist aber nicht der richtige Ansatz. Besser ist so lange warten mit> dem senden des nächsten Requests bis die Antwort vom vorherigen Request> eingetroffen ist.
Hi beric, danke, ich habe es so mal geändert und ausporbiert und es
klappt wunderbar!
Kilian K. schrieb:> Hi beric, danke, ich habe es so mal geändert und ausporbiert und es> klappt wunderbar!
Das freut mich. Ich habe es nämlich nicht getestet gehabt :-D
Aber verstehst du auch warum es funktioniert?
beric schrieb:> Das freut mich. Ich habe es nämlich nicht getestet gehabt :-D> Aber verstehst du auch warum es funktioniert?
Jap, ich verstehe es. Ist ja eigentlich auch recht simpel :-D
Denkanstoßer schrieb:> Warum eigentlich "===", ist das besser als "=="?
der == operator vergleicht die Rückgabewerte von valueOf, === vergleicht
auch den typ, und {}==={} ist immer false.
Folgendes gibt true aus:
alert({valueOf:function(){return 13;}}==13)