Array über die serielle Schnittstelle versenden

Guten Morgen,

im Zuge eines Projekts nehme ich die Messdaten einer Wägezelle auf (ca. 500 Werte). Diese würde ich gerne über die Serielle Schnittstelle an einen Raspberry Pi versenden und von dort aus in einer extra Datei ablegen. Anstatt jeden Wert einzeln zu übertragen, würde ich gerne alle Daten in einem Array ablegen und versenden. Hat jemand Erfahrungen damit machen können? Ist sowas möglich?

Danke für die Hilfe :slight_smile:

Ist sowas möglich?

Hmmm...
Du könntest das Array in einer Struktur ablegen, und diese Struktur mit den Printable Interface versehen.

struct MyStruct : Printable
{
// hier: Array definieren

// hier: virtual size_t printTo(Print& p) const; implementieren
}mystruct;

Später dann, in irgendeiner Funktion:

Serial.println(mystruct)

Wenn ich das richtig verstehe, willst du die Messdaten auf dem Arduino sammeln, bis 500 erreicht sind und dann diese 500 Messwerte an den Pi schicken? Du könntest einfach ein Array anlegen:

// Was auch immer du für einen Datentyp für deine Messdaten brauchst
datatype_t measuredValues[500];

Und die Messdaten darin speichern. Das Array kannst du dann einfach mit

for(int i = 0; i < 500; i++)
{
    Serial.println(measuredValues[i]);
}

versenden.

irgendwo zwischen gehen lernen (TO) und fliegen (combie) findet sich vieleicht so etwas :

/*
  Anstatt jeden Wert einzeln zu übertragen, würde ich gerne alle Daten in einem Array ablegen und versenden.
  http://forum.arduino.cc/index.php?topic=603522.msg4096329#new
  beigesteuert von noiasca
*/

int payload [] = {1, 2, 3, 5, 7, 11, 13};  // was wollen wir übertragen

const char *prefixMessage = "?";           // Am Anfang einer neuen Nachricht
const char *prefixValue = "";              // vor einem neuem Wert
const char *postfixValue = ";";            // nach einem neuem Wert
const char *postfixMessage = "\n";         // Am Ende der Nachricht

void transmitPayloadVariant0()             // Einfache Übertragung
{
  for (auto &current : payload) {          // for each für arme
    Serial.print(current);
  }
}

void transmitPayloadVariant1()             // Übertragung mit prefix/postfix
{
  Serial.print(prefixMessage);
  for (auto &current : payload) {          // for each für arme
    Serial.print(prefixValue);
    Serial.print(current);
    Serial.print(postfixValue);
  }
  Serial.print(postfixMessage);
}

void transmitPayload()                      // reduzierung des ersten prefix/letzten postfix
{
  uint16_t toTransmit = sizeof(payload) / sizeof(payload[0]);
  Serial.print(prefixMessage);
  for (uint16_t current = 0; current<toTransmit; current++) {  
    if (!current) Serial.print(prefixValue);                 // first value gets no prefix
    Serial.print(current);
    if (current!=toTransmit-1) Serial.print(postfixValue);   // last value gets no postfix
  }
  Serial.print(postfixMessage);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  transmitPayload();
  delay(3000); // dirty delay
}

geht.

Bedenke:
ein array von 500 Werten braucht 500, 1000 oder 2000 Byte (je nach Variablentyp byte/char, int oder long/float .
Die wenigsten Arduinomodelle haben genug RAM um diese Datenmenge im Speicher zu halten.

Grüße Uwe