Ring Buffer Serial.write()

Hallo zusammen

Weiss jemand wie das direkte Verschicken mit Serial.write() gestoppt werden kann, so dass ich erst die (standart) 64 Bytes befüllen kann um diese dann am Stück über die HW zu lassen?

Ich habe eine Funktion, die statische Daten, dann Daten aus dem (langsamen) SPI und I2C EEPROM, dann wieder statische Daten verschickt. Ich möchte das Packet am Stück verschicken, so dass der Client kompakt die Daten einlesen kann (über Serial.read()). Kompakt meint hier, mit einem sehr kleinen Timeout auf der serial.available() loop Schleife.

Gruss,
Markus

Warum machst Du Dir nicht einfach ein eigenes Bytearray welches Du aus den verschiedenen Quellen füllst? Wenn das dann fertig ist einfach in einer Schleife mit Serial.write() wegschicken.

Serial ist immer langsam, mehr oder weniger. Jedenfalls langsamer als das “langsame SPI”
An welche Geschwidigkeit hast du denn gedacht ?
Ob zwischen 2 Zeichen nur das minimale 1 Stopbit oder eine etwas längere Pause ist, sollte nichts ausmachen.

Warum willst du nicht, dass die ersten Zeichen etwas früher ankommen als mit deiner Methode ?
Genaugenommen kommt mit deiner Methode auch das letzte Zeichen später an als “nötig”.
Ich sehe den Vorteil nicht …

mit einem sehr kleinen Timeout auf der serial.available() loop Schleife

… “Timeout” verstehe ich hier nicht. Wenn du nicht willst, dann fang doch erst an zu lesen, wenn alles da ist.
Statt den 64 byte Sendepuffer zu manipulieren ist es doch leichter, den 64 byte Empfangspuffer (nicht) zu manipulieren und den Puffermechanismus seine Arbeit machen lassen, oder ?

Danke für euren Input.

@MaFu: Damit habe ich die Daten 2x im SRAM. Warum soll ich noch einen Buffer machen, wenn Serial.Write schon 64 (Standart in Library) reserviert hat?

@Michael: timeout meint hier eben, dass der Empfänger (mein MEGA) solange noch andere Sachen machen kann und erst in den Parse Mode vom Serial Stream geht, wenn ein Start-Byte kommt. ich könnte natürlich auch da im MEGA wiederum einen Buffer machen, der dann erst abgearbeitet wird, wenn das End-Char da ist. Aber auch dann habe ich wieder einen 2 Buffer.

So die Idee, wenn ich den Output erst sammeln kann, im Buffer für Serial.write, den dann release, habe ich beides zusammen abgedeckt.

Weiss jemand, wie ich das Versenden per Bit-Manipulation auf den Registern stoppen kann und wieder freigebe?

markuszelg:
ich könnte natürlich auch da im MEGA wiederum einen Buffer machen, der dann erst abgearbeitet wird, wenn das End-Char da ist. Aber auch dann habe ich wieder einen 2 Buffer.

Wieso? Einfach die Daten auf dem Mega erst auslesen, wenn alles da ist. Da brauchts doch keinen zweiten Buffer. Voraussetzung ist natürlich, dass die Anzahl der zu übertragenden Bytes immer gleich ist.