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
Serial buffer
24.04.2015, 08:16
Beitrag #1
Serial buffer
Guten Morgen zusammen,

kurze Zusammenfassung vorweg: Ich suche eine Referenz, die genauere Angaben macht als die Arduinoreferenz. Bestenfalls kommt dabei auch noch die Information rum, wie man sinnvoll Arduinofunktionen in der avr-lib nachschlägt, das habe ich noch nicht ganz verstanden.

Nun zum Problem:

Ich möchte Daten aus Matlab (zunächst mal ein Byte pro ms) über die serielle Schnittstelle an den Arduino Mega übertragen. Zunächst habe ich mit der Umkehrung angefangen:

Code:
Serial.write(buf, len) ;

Was auch funktioniert. Mein Problem resultiert nun daraus, dass mir die Arduino Befehlsreferenz nicht genau genug ist. Ich möchte gerne genauer wissen, was mit den Daten passiert. Zunächst bin ich nämlich davon ausgegangen, dass die Funtion die Daten einfach auf die serielle Schnittstelle schreibt und sich nicht darum kümmert was dann damit passiert. Wenn ich in Matlab aber nun bei einem gesendeten Array[20] nur 10 Werte abfrage und nach beliebiger Pause nochmal 10, dann habe ich alle Werte in der gewünschten Reihenfolge erhalten.

Wie arbeitet also der Puffer, wie groß ist er? Wie arbeitet er, wenn ich Zahlen versende, die mehr als ein Byte belegen?

Ich hoffe ich konnte meinen Informationsmissstand erklären und bedanke mich für Antworten.

Besten Dank,
Laura Heart
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.04.2015, 09:38
Beitrag #2
RE: Serial buffer
(24.04.2015 08:16)Laura schrieb:  Zunächst bin ich nämlich davon ausgegangen, dass die Funtion die Daten einfach auf die serielle Schnittstelle schreibt und sich nicht darum kümmert was dann damit passiert.
Das macht sie auch.

Zitat:Wenn ich in Matlab aber nun bei einem gesendeten Array[20] nur 10 Werte abfrage und nach beliebiger Pause nochmal 10, dann habe ich alle Werte in der gewünschten Reihenfolge erhalten.
Das liegt wahrscheinlich am Pufferverhalten der Maschine, auf der Matlab läuft.

Zitat:Wie arbeitet also der Puffer, wie groß ist er? Wie arbeitet er, wenn ich Zahlen versende, die mehr als ein Byte belegen?
Den Sourcecode findest Du hier in Deinem Arduino-Verzeichnis (also da, wo die IDE installiert ist):
Arduino\hardware\arduino\avr\cores\arduino
Schau mal nach HardwareSerial.cpp und .h. Dort sieht man, dass der Puffer auf dem Mega wahrscheinlich 64 Byte groß ist. Man sieht dort auch, dass alle Zahlen gnadenlos in ein Byte umgewandelt werden. write kann also im Prinzip nur Bytes. Außerdem wird von Print (.h/.cpp) das write für Byte-Arrays und char-Arrays übernommen.
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
24.04.2015, 09:47
Beitrag #3
RE: Serial buffer
Hi Laura,
nun du suchst den Sende oder Empfangspuffer, also zumindest ist in den ATmegas Hardwaremäßig keiner enthalten. Hardwaremäßig könnte aber PC-seitig einer enthalten sein zumindest war das vor Einführung von USB Adaptern so.
Von daher würde ich mal ausgehen das ein Arduino die Daten nacheinander sendet solange das Programm es vorgibt. Hier wird dann einfach abgefragt ob das Senderegister leer ist und wenn ja wird das nächste Zeichen gesendet wobei es beim Arduino keinen Handshake gibt der einen Datenverlust verhindert - zumindest ist mir dazu an der Stelle noch nichts bekannt geworden.
Beim Empfang wird es auch so ein nur umgekehrt, hier wird dann geprüft ob ein Zeichen im Empfangsregister eingegangen ist und das wird dann ausgelesen.
Von daher würde ich dir mal empfehlen mit einem Zweiten Arduino gezielt Daten zu senden bzw. zu empfangen um zu sehen ob und wo auf dem Arduino eine Pufferung stattfindet.

Und mal so am Rande, wenn die alle 1mS ein Zeichen transferieren willst mußt auf jeden Fall eine höhere Baudrate wie 9600 Baud wählen.

lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.04.2015, 15:26
Beitrag #4
RE: Serial buffer
(24.04.2015 09:47)Bitklopfer schrieb:  Und mal so am Rande, wenn die alle 1mS ein Zeichen transferieren willst mußt auf jeden Fall eine höhere Baudrate wie 9600 Baud wählen.
Kommt das nicht in etwa hin mit 9600 Baud? Ok, vielleicht nicht ganz, aber fast.

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
24.04.2015, 21:04
Beitrag #5
RE: Serial buffer
Moin,
also soweit ich das kapiert habe benutzt die Serial - Klasse Methoden der Stream -Klasse. Serial.readBytes() greift dabei auf stream.readBytes() zurück.
Die Stream - Klasse wird nie direkt aufgerufen, hat aber eine Methode setTimeOut, die an die Serial - Klasse vererbt wird. Somit kann man mit Serial.setTimeOut() die maximale Wartezeit bis zum nächsten Datum setzen. Ist sicher interessant wenn man bedenkt, dass die Serial - Klasse asynchron arbeitet.
Der Arduino hat hardwaremäßig keinen Buffer , jedoch einen in Software gesetzten Round Robin Buffer. Dieser Buffer ist 64 Byte groß, definiert über
Code:
#define SERIAL_BUFFER_SIZE 64
in der HardwareSerial.cpp.
Über eine Kopie der Standardinstall und Anpassung des genannten define und einen zusätzlichen Abschnitt in der board.txt kann man einen "virtuellen" Arduino mit angepassten Buffer in die IDE einbauen und den Code dann compilieren. Wie das geht steht genauer hier:
http://www.hobbytronics.co.uk/arduino-se...uffer-size
Kann nicht sagen ob das jetzt hilfreich war Huh
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.04.2015, 22:21
Beitrag #6
RE: Serial buffer
(24.04.2015 15:26)Thorsten Pferdekämper schrieb:  
(24.04.2015 09:47)Bitklopfer schrieb:  Und mal so am Rande, wenn die alle 1mS ein Zeichen transferieren willst mußt auf jeden Fall eine höhere Baudrate wie 9600 Baud wählen.
Kommt das nicht in etwa hin mit 9600 Baud? Ok, vielleicht nicht ganz, aber fast.

Hi Thorsten,
...richtig erkannt...nur fast...weil alle 1mS sind 1000 Zeichen bestehend aus 1 Startbit, 8 Datenbit und 1 Stopbit...macht 10 Bit oder mal 1000 eben 10000 Bit und bei 9600 Baud fehlen dir am Ende eben 40 Zeichen...
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.04.2015, 12:58
Beitrag #7
RE: Serial buffer
Moin Jungs,

danke soweit erstmal, damit kann ich schonmal was anfangen.

Ja die Baudrate werde ich erhöhen. Ich verstehe richtig, dass der Arduino 10bit/bd überträgt?

Also wäre für meine Anwendung sinnvoll, soweit erhöhte Baudrate zu verwenden, die das Senden von zusätzlichen Befehlen zulässt, korrekt? Ich stelle mir Folgendes vor:
  • 2 Arrays als "Puffer"
  • beginnt der Arduino, das erste von vorn nach hinten zu verarbeiten, sendet er ein Kommando an Matlab, das zweite mit den nächsten Werten zu füllen
  • ist das erste abgearbeitet wechselt er zum zweiten und startet eine Abfrage an Matlab, um das erste mit neuen Daten zu füllen
  • ...

Ist das eine performante Lösung oder gibt es für diese Anwendung elegantere Wege?

Bemerkung: Die Daten werden im weiteren Verlauf für eine möglichst hochfrequente PWM genutzt, da das Signal zur Zeit mit einem Tiefpass geglättet wird.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.04.2015, 20:36
Beitrag #8
RE: Serial buffer
(26.04.2015 12:58)Laura schrieb:  ....
Ja die Baudrate werde ich erhöhen. Ich verstehe richtig, dass der Arduino 10bit/bd überträgt?
...

Nabend,
ähm bissi falsch kombiniert... Baud heißt Bit pro Sekunde. Und um ein Zeichen zu übertragen werden 10 Bit benötigt wie schon oben beschrieben.
Von dem Matlab Zeuchs habe ich keine Ahnung...weis nur das es ne Eierlegende Wollmilchsau für Simulierer ist...Big Grin
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 84 12.11.2016 20:29
Letzter Beitrag: Hannes
  Speicher sparen bei serial.print?? DL1AKP 3 192 02.09.2016 13:32
Letzter Beitrag: hotsystems
  Serial Monitor ASCII 1 schreiben BennIY 11 574 01.08.2016 16:42
Letzter Beitrag: Mathias
  Serial.write Mathias 6 376 29.07.2016 17:06
Letzter Beitrag: Mathias
  Serial Monitor Rudi 5 623 02.06.2016 11:37
Letzter Beitrag: Bitklopfer
  Serial.printeln, Stellen verschwinden Mathias 6 253 27.05.2016 17:44
Letzter Beitrag: Mathias
  Kommunikation Serial Monitor --> Arduino BennIY 7 340 24.05.2016 07:48
Letzter Beitrag: hotsystems
  Serial Monitor Eingabe über Code Maxi290997 4 514 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  Buffer reservieren im SRAM vom DUE arduinopeter 1 298 28.03.2016 10:16
Letzter Beitrag: rkuehle
  SPI Buffer empfangen BennIY 5 706 17.03.2016 13:35
Letzter Beitrag: Bitklopfer

Gehe zu:


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