Hallo Arduino Community, ich habe sonnst mit Assembler Programmiert und steige langsam auf Arduino um.
Bei Assembler muss ich bei einem SoftwareSerial Port Zeichen für Zeichen empfangen und in den Speicher legen.
Wie ist das mit Arduino? Wo stehen die Daten? Sind das einzelne Speicherplätze oder ein Stream? Wenn ich warte bis Daten da sind und die dann mit read auslese, lese ich dann immer Byte für Byte und wie verhindere ich das ich nicht mehrfach die gleiche Daten einlese? Wie ist es, wenn ich nicht rechtzeitig ein Zeichen empfang, wird das dann gelöst beim nächsten empfangenen Zeichen?
So sind einige Fragen aber vielleicht kann mir jemand beim Einstig helfen.
Die Arduino Serial Klassen haben zwei Ringpuffer. Einen zum Senden und einen zum Empfangen.
Sende-seitig blockiert der Ringpuffer wenn er voll ist das Programm bis wieder Platz ist. Empfang-seitig gehen glaube ich die ältesten Daten verloren wenn man ihn nicht schnell genug ausließt. Wenn du read() machst werden das jeweilige Byte aus dem Ringpuffer entfernt.
Buzii:
Wie ist das mit Arduino? Wo stehen die Daten?
Das ist empfangsseitig bei HardwareSerial und SoftwareSerial unter Arduino weitestgehend identisch gelöst.
Im RAM wird ab dem Aufruf "Serial.begin()" ein Empfangspuffer (und bei HardwareSerial auch ein Sendepuffer) von 64 Byte Größe reserviert, der prinzipbedingt bis zu 63 Zeichen aufnehmen kann, bis er "voll" ist.
Buzii:
wie verhindere ich das ich nicht mehrfach die gleiche Daten einlese?
Serial.read() liefert immer das nächste zu lesende Zeichen oder -1 (Integerwert!) zurück, wenn der Empfangspuffer leer ist.
Buzii:
Wie ist es, wenn ich nicht rechtzeitig ein Zeichen empfang, wird das dann gelöst beim nächsten empfangenen Zeichen?
Es können bis zu 63 Zeichen im Empfangspuffer zwischengepuffert werden, bevor Du ein Zeichen auslesen mußt.
Übrigens: "SoftwareSerial" ist eine für so ziemlich alle denkbaren Zwecke völlig UNBRAUCHBARE Library, also der größte Mist, der mit der Arduino-IDE mitgeliefert wird. Gleichzeitiges Senden und Empfangen ist damit zum Beispiel nicht möglich.
Wenn Du eine SoftwareSerial-Schnittstelle benötigst, die auch zuverlässig und ohne ständige Datenfehler funktioniert, dann installiere Dir unbedingt die AltSoftSerial-Library: AltSoftSerial Library, for an extra serial port
Deren einziger Nachteil ist, dass die Pins je nach Board fest vorgegeben sind und nicht frei gewählt werden können. Dafür funktioniert diese Library sehr zuverlässig (im Vergleich zur Arduino-SoftwareSerial).
jurs:
Im RAM wird ab dem Aufruf "Serial.begin()" ein Empfangspuffer (und bei HardwareSerial auch ein Sendepuffer)
Ich weiß nicht wie es beim normalen SoftSerial ist, aber AltSoftSerial hat ebenfalls zwei Puffer. Und zwar 68 zum Senden und 80 zum Empfangen. Kann man natürlich auch ändern.