Hi,
ich knabbere hier an einem merkwürdigem Phänomen.
Immer wenn ich ein Kommando über die serielle an einenn Arduino schicke ist das erste immer ein leerer String mit einem Return.
Erst beim zweiten mal Senden wird das Kommando korrekt empfangen.
Hier die entsprechenden rules:
Und hier der Arduino Code (wird automatisch am Ende jedes Loops ausgeführt):
Irgendwie hab ich Tomaten auf den Augen und finde den Fehler nicht. Letzenendes wird doch jedesmal der gleiche Befehl gesendet (bzw der selbe String) auf identische Weise. Aber nur der zweite wird verstanden und der erste ist immer leer.
Aber da man leider immer nur das liest was man denkt zu lesen, hoffe ich mal auf jemand mit einem "neuen" Blick.
Kann doch nur eine dämliche Kleinigkeit sein, die ich da bei Änderungen irgendwann "eingebaut" habe.
Vorher, als ich noch einen überflüssigen Delay am Ende der Loop drin hatte, wurden manchmal die ersten Zeichen des Kommandos verschluckt (zB "duCmd:giveTemperatur") aber nicht so, daß immer die erste Msg leer war.
Grüße
Heiko
PS:vielleicht ist es von Bedeutung, daß bei der BadMsg offensichtlich zwei \n's zurückgesendet werden? Sry, ich komm einfach nich auf den Trichter
[edit]
PPS:
Ahhhhhhhh!
Habs gefunden
Das Einlesen der Seriellen ging schneller als gesendet wurde und er ist zwischenzeitlich nochmal durch den Loop gegangen, wo der String geleert wurde, weil ich vergaß nach Abarbeitung des Kommandos das (die) Flag von stringComplete auf false zurück zu setzen.
Puh, kann so was nerven
war also mal wieder wie erwartet eigene Blödheit (die einen die halbe Nacht wach hält)
Sry für einen unnötigen Thread.
ich knabbere hier an einem merkwürdigem Phänomen.
Immer wenn ich ein Kommando über die serielle an einenn Arduino schicke ist das erste immer ein leerer String mit einem Return.
Erst beim zweiten mal Senden wird das Kommando korrekt empfangen.
Code:
2015-01-10 06:29:00.054 [INFO ] [runtime.busevents ] - Arduino received command ArduCmd:giveTemperature 2015-01-10 06:29:00.341 [INFO ] [runtime.busevents ] - Arduino state updated to BadMsg: 2015-01-10 06:29:00.514 [INFO ] [runtime.busevents ] - Arduino received command ArduCmd:giveTemperature 2015-01-10 06:29:01.540 [INFO ] [runtime.busevents ] - Arduino state updated to Temperatur:21.44C; 2015-01-10 06:29:01.669 [INFO ] [runtime.busevents ] - Arduino_temperature state updated to 21.44
Code:
rule "Arduino on Update" when Item Arduino received update then var String ArduinoUpdate = Arduino.state.toString.trim if (ArduinoUpdate.contains("Temperatur:")) { var int temperatureStartsOn = ArduinoUpdate.indexOf("Temperatur:") + "Temperatur:".length var String temperature = ArduinoUpdate.mid(temperatureStartsOn, ArduinoUpdate.indexOf('C')-temperatureStartsOn) var double temperatureDouble = new Double(temperature) Arduino_temperature.postUpdate(temperatureDouble) } if (ArduinoUpdate.contains("BadMsg")) { sendCommand(Arduino, lastCommand) } end rule "Arduino Temperature" when Time cron "*/30 * * * * ?" then var String command="ArduCmd:giveTemperature\n" sendCommand(Arduino, command) lastCommand=command end
Code:
void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == '\n') { String ac="ArduCmd:"; if (inputString.indexOf(ac)>=0){ inputString=inputString.substring(ac.length(),inputString.length()); stringComplete = true; } else{ Serial.print("BadMsg:"); Serial.println(inputString); inputString=""; stringComplete = false; } } } }
Aber da man leider immer nur das liest was man denkt zu lesen, hoffe ich mal auf jemand mit einem "neuen" Blick.
Kann doch nur eine dämliche Kleinigkeit sein, die ich da bei Änderungen irgendwann "eingebaut" habe.
Vorher, als ich noch einen überflüssigen Delay am Ende der Loop drin hatte, wurden manchmal die ersten Zeichen des Kommandos verschluckt (zB "duCmd:giveTemperatur") aber nicht so, daß immer die erste Msg leer war.
Grüße
Heiko
PS:vielleicht ist es von Bedeutung, daß bei der BadMsg offensichtlich zwei \n's zurückgesendet werden? Sry, ich komm einfach nich auf den Trichter

[edit]
PPS:
Ahhhhhhhh!
Habs gefunden

Das Einlesen der Seriellen ging schneller als gesendet wurde und er ist zwischenzeitlich nochmal durch den Loop gegangen, wo der String geleert wurde, weil ich vergaß nach Abarbeitung des Kommandos das (die) Flag von stringComplete auf false zurück zu setzen.
Puh, kann so was nerven

war also mal wieder wie erwartet eigene Blödheit (die einen die halbe Nacht wach hält)

Sry für einen unnötigen Thread.