Arduino Serialreading

Hallo Ihr da draußen,

habe ein kleines Spaß-Projekt gerade in der Mache.
Es geht um einen Arduino, welcher einen String über die serielle Schnittstelle erhält.
Der String (Zeichenfolge aus 1 und 0, 12 Stellen lang) wird in Char’s zerlegt, welche dann Interpretiert werden.
Später wird die Zeichenfolge von einem Windows-Programm über die serielle Schnittstelle gesendet.

Bei der Arduino-Software habe ich allerdings noch Schwierigkeiten.
Die Ausgänge 0 und 1 sind dauerhaft gesetzt. Die Ansteuerung der anderen Pins ist immer um eins nach vorne verschoben. Also gesendeter String sagt Pin 8 einschalten, aber Pin7 wird geschaltet. Das hatte ich in einer anderen Programmversion auch schon fixen können. Denke aber dass in der Stringverarbeitung noch irgendwo ein Wurm steck, welchen ich nicht finden kann.

Könnt Ihr mir dabei helfen?

Das Programm findet Ihr unten. Teilweise sind zu Diagnose noch Serielle Ausgaben eingebaut. Die werden später entfernt.

Für eure Hilfe wäre ich sehr dankbar!

Viele Grüße
kleiner_kaktus

Sry, hier noch der Quellcode:

String receivedInformation;
char Inhalt[12];

void setup() {
  Serial.begin(9600);
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {

  if (Serial.available() > 0)
  {
    receivedInformation = Serial.readString();
    receivedInformation.toCharArray(Inhalt, 12);
    Serial.print(receivedInformation);
    Serial.print("_");

    for (int i = 0; i <= 11; i++)
    {
      Serial.print(Inhalt[i]);
      
      if (Inhalt[i] == '1')
      {
        digitalWrite(i+1, HIGH);
      }
      else
      {
        digitalWrite(i+1, LOW);
      }      
    }
    Serial.println();
  }
}

Hallo!

Du sorgst nirgends dafür, daß du exakt 12 Bytes von der seriellen Schnittstelle liest. Bei der niedrigen Baudrate kann es sein, daß die Schleife jedes Byte einzeln sieht und jeweils ganz am Anfang in Inhalt schreibt, und damit immer wieder nur Ausgang 1 setzt.
Wenn du die serielle Ausgabe des Arduinos überwachst, solltest du weniger als 12 Zeichen zwischen den Unterstrichen sehen.

Ich kenne den Arduino und seine Bibliotheken nicht.
Im komfortabelsten Fall kannst du prüfen, wie viele Zeichen im Puffer sind, um dann exakt 12 Zeichen zu lesen. Im spartanischen Fall liest du so lange einzelne Zeichen, bis du 12 zusammen hast.

Es wäre auch nicht ungeschickt, wenn du jede 12 Zeichen-Nachricht um ein Start- und Stop-Zeichen erweiterst. So kannst du prüfen, ob du auch tatsächlich eine vollständige Nachricht erhalten hast, und nicht z.B. durch Pufferüberlauf eins übersehen hast. Denn dann würdest du plötzlich um eins versetzt die Ausgänge ansteuern.


Noch was anderes: Falls du planst, die eingebaute serielle Schnittstelle deines Computers (oder ein RS232-USB-Interface) zu nutzen, sei gewarnt: RS232 benutzt Spannungen von bis zu +/-30V, während ein Mikrokontroller 0V und 3,3 bzw 5V für seine serielle Schnittstelle benutzt. Zudem sind die Bedeutungen der Signalpegel vertauscht. Schließt man einen Mikrokontroller direkt an RS232 an, stehen die Chancen gut, den Mikrokontroller zu grillen. Es braucht einen Pegelwandler wie z.B. den bekannten MAX232, damit das funktioniert.
Manche Arduinos haben sowas an Bord, andere haben anscheinend direkt ein USB-Interface drauf, über das die serielle Kommunikation läuft. Da ist das nicht nötig.

Hallo sweber,

danke für die schnelle konstruktive Rückmeldung.
Werde mich dem ganzen mal annehmen und Zeichenweise versuchen zu lesen.

Bezüglich der Schnittstelle, habe ich geplant nur den On-Board USB Anschluss zu nutzen, werde da also keine Probleme bekommen, bezüglich Spannungspegel, etc.

Viele Grüße
kleiner_kaktus

Und wie genau stellst Du Dir dann eine serielle Übertragung vor? Ein USB-Anschluss hat ein Protokoll, das man einhalten muss! Und das hat genau gar nichts mit einer RS232-Schnittstelle mit Baudrate zu tun!

Willst Du nicht einfach erst mal ein paar Demo-Programme ausprobieren? Und die dann verändern? So wird das doch im Leben nichts.
Gruß
anf

Der Arduino nutzt einen speziellen Baustein, welcher das normale serielle Protokoll in USB umsetzt. Auf dem PC ist dann das Gegenstück, welches per Software der Anwendung eine normale RS-232 Schnittstelle simuliert. Programmtechnisch merkt man den Unterschied gar nicht.

Solche Umsetzer hatten wir schon vor USB. Diese verwendeten Ethernet für die eigentliche Datenübertragung und hatten auf der anderen Seite einen normalen RS-232 Stecker.
Die Dinger machten nur Probleme, wenn die IT gerade Backups über Ethernet machte, dann hatten die Reaktionszeiten nichts mehr mit RS-232 gemeinsam. :frowning:

Aber auch die guten Alten Telefon-modems haben nichts anderes gemacht. Bei einer Übertragung über ein Modem gab es programmtechnisch eigentlich auch keinen Unterschied. Das einzige war der Verbindungsaufbau, welcher aber mit der Datenübertragung nichts zu tun hatte.

MfG Peter(TOO)

1 Like