Ankündigung

Einklappen
Keine Ankündigung bisher.

[solved]sendCommand serial erste msg immer leer

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [solved]sendCommand serial erste msg immer leer

    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.
    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
    Hier die entsprechenden rules:
    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
    Und hier der Arduino Code (wird automatisch am Ende jedes Loops ausgeführt):
    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;
          }  
        }
      }  
    }
    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.
Lädt...
X