Go Down

Topic: Problem mit .charAt() (Read 1 time) previous topic - next topic

Semf2015

hallo liebe leute, :)
wir müssen im Rahmen der Schule ein Arduinoprojekt umsetzen, jedoch haben wir leider keinerlei Erfahrung mit Arduinos und könnten gut eure Hilfe benötigen :)

Code: [Select]
  String binaertext;
  int aktuell;
 
  void setup() {
    Serial.begin(9600);
    pinMode(13,OUTPUT);
  }
 
  void loop() {
    if(Serial.available() > 0) {
      binaertext = String(Serial.read(), BIN);   
      Serial.print(binaertext);
    for (int i = 1; i < binaertext.length(); i++) {
//      aktuell = int(binaertext.charAt(i));
      if (binaertext.charAt(i)==1){
      digitalWrite(13,HIGH);
      delay(1000);
    }
    if (binaertext.charAt(i)==0){
      digitalWrite(13,LOW);
      delay(1000);
    } 
    }
    }   
  }


Das Programm funktioniert folgendermaßen:
Man gibt einen Text ein, dieser wird dann in Binärcode umgewandelt. Der Binärcode ist in der String Variable binaertext gespeichert und wir wollen den Binärcode per Laser übertragen, weshalb wir die einzelnen Stellen der Variable überprüfen wollen und wenn die aktuelle Stelle eine 1 oder 0 ist soll der Laser angeschaltet bzw. ausgeschaltet werden. Jedoch gibt es Probleme mit der If-Abfrage mit dem .charAt() . Beim kompilieren wird kein Fehler ausgegeben und wenn man die dritte If-Abfrage durch ein " else " ersetzt wird dieser Teil auch durchgeführt. Wir haben auch schon versuch mit Hilfe der Variable "aktuell" mit dem Typ integer den Teil:" binaertext.charAt()==1 " abzulösen (siehe Kommentarzeile) aber auch dies funktioniert nicht. Als wir probeweise eine neue Variable des Typs integer erstellt haben die nur den Inhalt "1" hat, funktionierte die If-Abfrage. Es scheint also an dem Teil mit dem .charAt() zu liegen...

Hat einer von euch eventuell eine Idee ?

LG

Serenifly

Da steht ASCII drin. '1' und '0'. Nicht 1 und 0.

Beachte übrigens dass BIN keine führenden Nullen erzeugt.

Semf2015

okay vielen Dank, das hat das Problem behoben.
Kannst du uns sagen ob wir damit den Binärcode auf dem anderen Arduino (wo der laser auf einen fototransistor strahlt) wieder zurück zu text wandeln können? da du das Problem mit der führenden Null angesprochen hast... oder hast du eine Idee wie man relativ unkompliziert die Nullen einfügen kann ? :)

Serenifly

Wenn du die führenden Nullen brauchst kannst du die per Hand senden. Einfach in einer Schleife die Differenz aus String Länge und gewünschter Breite senden.

Wenn es unbedingt String Objekte sein müssen, bekommst du mit c_str() einen Zeiger auf das interne Array:
http://arduino.cc/en/Reference/CStr
Damit kannst du dann strtoul() füttern:
http://www.cplusplus.com/reference/cstdlib/strtoul/
Das hat als dritten Parameter die Basis des Zahlen-Systems. Also 2 hier.

Man kann auch gleich C-Strings verwenden. Da gibt es itoa() für Integer -> Binär-String:
http://www.cplusplus.com/reference/cstdlib/itoa/

uwefed

Du kannst aber auch einfach den Laser (über einen Transistor) mittels der seriellen Schnittstelle (Hardware oder Software) ansteuern und gleiches beim Empfänger. So brauchst Du nur normal Serial.print("text") und serial.Read() wie Du über einen Kabel übermitteln würdest.

grüße Uwe 

Serenifly

Stimmt. Das wäre das vernünftigste :)

Und auch sonst ist der Umweg über Strings eigentlich etwas unsinnig. Es geht, aber man kann auch aus einem Integer/Byte direkt einzelne Bits auslesen und setzten:
http://arduino.cc/en/Reference/BitRead
http://arduino.cc/en/Reference/BitWrite

Go Up