INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Problem mit serieller Datenübertragung
05.05.2015, 16:07
Beitrag #1
Problem mit serieller Datenübertragung
Hallo Experten,
seit kurzem versuche ich mich in die Programmierung des Arduino einzuarbeiten. Nun habe ich ein Problem mit der Kommunikation über die serielle Schnittstelle. Das Programm zum Testen ist denkbar einfach.
Code:
void setup()
{
  Serial.begin(9600);
}

int i=1;

void loop()
{
//  delay(50);
  Serial.println(i);
  i++;
}

Das Programm sollte eigentlich die Zahlen beginnend bei 1 im serial monitor ausgeben. Bei der ersten Zahl passiert allerdings für mich etwas unerwartetes. Vor der 1 sind irgendwelche anderen Zeichen. Alle nachfolgenden Zahlen werden richtig ausgegeben. Wenn ich im loop eine kleine Pause einfüge, dann wird alles richtig ausgegeben. Es kann aus meiner Sicht nicht sein, dass man das Programmm künstlich langsam machen muss, nur damit es funktioniert. Und warum funktioniert es dann? Hat jemand so etwas beobachtet und hat jemand eine Lösung für das Problem?

Verwendet wird Arduino Uno R3 mit Arduino 1.0.6.

Ich freue mich auf eure Vorschläge
Gruß
OlfLab
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.05.2015, 18:03
Beitrag #2
RE: Problem mit serieller Datenübertragung
Hi,
das Verhalten habe ich auch schon beobachtet. So ganz erklären kann ich es auch nicht, womöglich fängt die serielle Schnittstelle des PC da irgendwelche Einschwingvorgänge auf. Man sowieso nicht 100% davon ausgehen, dass man über die serielle Schnittstelle eine komplett fehlerfreie Kommunikation hat. Dafür muss man nochmal eine Protokollschicht draufbasteln.
Es reicht übrigens wahrscheinlich, das delay nur einmal im Setup zu machen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.05.2015, 18:17
Beitrag #3
RE: Problem mit serieller Datenübertragung
Hallo OlfLab,

das liegt wohl im wesentlichen daran, dass print asynchron arbeitet. Dies bedeutet, dass einfach nur der Ready-Status für den TX-Kanal also Sendekanal abgewartet wird und danach sofort das nächste Zeichen raus geht. Das Problem: der TX - Kanal ist bei allen Arduino, außer dem Leonardo bei fehlender USB-Verbindung, immer ready. Daher wird wohl das Serial.print() vor dem 1. Zeichen irgendwas raus geben.
Durch das delay() wird zwar etliches im Ablauf gestoppt, aber die serielle Kommunikation, speziell der RX-Kanal also Empfangskanal, nicht. In dem Sketch werden daher in den ersten 50 ms schon mal Daten an Serial übergeben und können dann angezeigt werden. Als Gegenprobe müsste das delay(50) hinter dem Serial.print () wieder irgendwelchen Kram vor der ersten echten Ausgabe bringen Huh
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.05.2015, 07:30
Beitrag #4
RE: Problem mit serieller Datenübertragung
Vielen Dank für eure Antworten.
Einige Dinge sind mir trotzdem noch nicht ganz klar. Zunächst einmal zu
Zitat:dass man über die serielle Schnittstelle eine komplett fehlerfreie Kommunikation hat. Dafür muss man nochmal eine Protokollschicht draufbasteln.
Wenn es zufällig auftreten würde und das bei einigen bits, würde ich es akzeptieren. Es handelt sich um ein reproduzierbares Verhalten. Das Problem ist also immer an der selben Stelle.

Zitat:Es reicht übrigens wahrscheinlich, das delay nur einmal im Setup zu machen.

Genau das habe ich mir auch gedacht, aber irgendwie hat es nichts gebracht. Und genau das ist der Punkt, der mich stutzig macht. Ich bin davon ausgegangen, dass zunächst die Variablen derklariert werden, dann die funktion setup aufgerufen wird und anschließend die Funktion loop. Wenn die serielle Schnittstelle in der Funktion setup initialisiert wird, müsste einiges an Kommunikation zwischen Arduino und PC stattfidnen, wo wie rkuehle es beschrieben hat. So weit nachvollziehbar. Aber müsste der Speicher nicht überschrieben werden, wenn ich etwas senden will? Und zwar vollständig?

Ich habe mit dem Minimalbeispiel noch ein wenig herumgespielt und einiges festgestellt. Ich habe zunächst in der Funktion setup eine Zeile hinzugefügt. Natürlich nach der Festlegung der Baudrate.
Code:
Serial.println("Hallo Welt!");
Die sonderbaren Zeichen tauchen jetzt direkt vor diesem Text auf. Die Zahlen werden so ausgegeben, wie sie sein sollten. Wenn man den Inhalt der Funktion loop löscht, dann tauchen auch vor dem Text keine Zeichen mehr auf. Das ist ein merkwürdiges Verhalten. So richtig vertrauenserweckend ist es leider nicht.

Gruß
OlfLab
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.05.2015, 10:13
Beitrag #5
RE: Problem mit serieller Datenübertragung
(06.05.2015 07:30)olflab schrieb:  
Zitat:dass man über die serielle Schnittstelle eine komplett fehlerfreie Kommunikation hat. Dafür muss man nochmal eine Protokollschicht draufbasteln.
Wenn es zufällig auftreten würde und das bei einigen bits, würde ich es akzeptieren. Es handelt sich um ein reproduzierbares Verhalten. Das Problem ist also immer an der selben Stelle.
Ich wollte damit eigentlich nur sagen, dass es (zumindest bei mir) in der Praxis irrelevant war. Entweder es gibt sowieso nochmal eine Protokollschicht, durch die sowas ignoriert wird, oder man benutzt die serielle nur für Debug-Ausgaben, wo es erst recht egal ist.
"Akademisch" interessant ist das Verhalten aber trotzdem. So ganz schlüssig konnte ich es mir auch nicht erklären, also forschen wir mal.

Zitat:
Zitat:Es reicht übrigens wahrscheinlich, das delay nur einmal im Setup zu machen.

Genau das habe ich mir auch gedacht, aber irgendwie hat es nichts gebracht. Und genau das ist der Punkt, der mich stutzig macht. Ich bin davon ausgegangen, dass zunächst die Variablen derklariert werden, dann die funktion setup aufgerufen wird und anschließend die Funktion loop.
Die Deklaration der Variablen wird während der Laufzeit gar nicht gemacht, das ist nur für den Compiler. Da werden höchstens Speicherbereiche reserviert.

Zitat:Wenn die serielle Schnittstelle in der Funktion setup initialisiert wird, müsste einiges an Kommunikation zwischen Arduino und PC stattfidnen,
Nein, da passiert gar nichts. Es gibt keinen Handshake oder so. Du musst nicht einmal einen PC anschließen, die Serielle sendet trotzdem.

Zitat:Aber müsste der Speicher nicht überschrieben werden, wenn ich etwas senden will? Und zwar vollständig?
Wieso das denn? Das hier ist der Sourcecode vom write:
Code:
void HardwareSerial::write(uint8_t c)
{
  while (!((*_ucsra) & (1 << _udre)))
    ;

  *_udr = c;
}
Soweit ich das verstehe bedeutet das einfach: Warte bis das vorherige Byte gesendet wurde (falls es ein vorheriges Byte gibt), dann schiebe das Byte raus.
Wie das eine Ebene darunter genau läuft verstehe ich momentan auch nicht, aber es wird da nichts überschrieben.

Zitat:Die sonderbaren Zeichen tauchen jetzt direkt vor diesem Text auf.
Das hatte ich auch beobachtet. Es passiert immer ganz am Anfang, normalerweise nicht zwischendurch.

Zitat:Die Zahlen werden so ausgegeben, wie sie sein sollten. Wenn man den Inhalt der Funktion loop löscht, dann tauchen auch vor dem Text keine Zeichen mehr auf. Das ist ein merkwürdiges Verhalten. So richtig vertrauenserweckend ist es leider nicht.
Ja, ist schon etwas seltsam. Vielleicht stimmt da aber auch was mit dem Adapter (also der Hardware) nicht. Ist das ein Original-Arduino oder ein Nachbau?
Hast Du Dir mal den Sourcecode von Serial etc. betrachtet?

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Datenübertragung vom Arduino Mega 2560 zu Hterm Datatom 1 99 13.11.2016 23:08
Letzter Beitrag: hotsystems
  Problem mit SD Card Library BennIY 4 193 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 212 22.08.2016 19:42
Letzter Beitrag: Eichner
  4x16 Tastermatrix Problem Michel 16 852 14.07.2016 10:02
Letzter Beitrag: StephanBuerger
  Problem mit Delay und Millis funnyzocker 1 459 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Interrupt bei Serieller Übertragung Binatone 8 365 21.06.2016 14:09
Letzter Beitrag: Scheams
  Problem mit ESP8266 und EMail senden torsten_156 1 606 13.06.2016 21:14
Letzter Beitrag: torsten_156
  ESP8266_01 flashen - Problem torsten_156 12 1.056 30.05.2016 20:12
Letzter Beitrag: torsten_156
  Hardwareserial/Softserial: Problem mit Superklasse tuxedo0801 10 483 19.05.2016 12:25
Letzter Beitrag: amithlon
  ESP8266 HTML Problem arduino_weatherstation 1 498 25.04.2016 21:52
Letzter Beitrag: rkuehle

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste