Go Down

Topic: Datenaustausch über die Serielle Schnittstelle String zerlegen ,zusammensetzen (Read 1 time) previous topic - next topic

basteldin

Hallochen

ich möchte gerne Daten von einem zum anderen Arduino über die Serielle Schnittstelle Senden und Enpfangen da meine Zahlenwerte größer als 255 sind muss ich zwei bytes senden

habe folgende überlegung

Sender:

Code: [Select]



char Senderdaten []={A234,B567};

Serial.write (Senderdaten[0]);
delay (100);
Serial.write (Senderdaten[1];

[\code]


Empfänger :
[code]


char Senderdaten[]={0,0};
if Serial.available(){

if (Serial.read () ==A){

Senderdaten[0]=Serial.read();
}

if ( Serial.read()==B){
Senderdaten[1] = Serial.read();
}
}

[\code]

und dann möchte ich die daten wieder zusammen fügen so das ich beim Empfänger

die Zahl 234567 erhalte

vl hat da jemand einen Link für mich wie man sowas macht hatte bei meiner Suche keinen Erfolg


Tommy56

write kann mehrere Bytes schicken. Schaue Dir mal struct an, um mehrere Werte zu einer Einheit zusammen zu fassen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

agmue

ich möchte gerne Daten von einem zum anderen Arduino über die Serielle Schnittstelle Senden und Enpfangen ...
Wenn die Arduinos nicht zu weit von einander entfernt sind, könntest Du auch I2C als Schnittstelle verwenden. Bei UNOs und dergleichen bleibt dann die serielle für USB frei.

Beispiel ohne struct für SoftwareSerial: Telemetrie für ein Dampfschiff

michael_x

Quote
char Senderdaten []={A234,B567};
Das ist leider Unsinn.

Meinst du eventuell   const char* Senderdaten[] = {"A234", "B567"};     ?

Oder willst du statt 8 Buchstaben einfach nur 2 Byte übertragen? ( Was auch nicht reicht für 234567 )



Du solltest auch den Unterschied zwischen A , 'A' und "A" erkennen können, wenn du dich an solche Aufgaben wagst.

Uder dir entweder
Code: [Select]
union  { long i; byte b[4]; } data;
data.i = 234567;
 
Serial.write(data.b, 4);


Oder Zeiger-Hexereien ansehen.

An der Empfängerseite hast du dann evtl. auch noch ein bisschen zu knobeln.
Oder ist dir klar, wann die Übertragung zu Ende ist? (sind es immer 3 Ziffern nach einem Buchstaben?)

basteldin

Also die Buchstaben habe ich nur gedacht um die ankommende Zahl am Empfänger zu identifizieren war mir klar das das Unsinn ist war nur eine Überlegung

der Unterschied zwischen 'A' und "A" ist das 'A' ASCI ist oder ?

also Buchstaben brauche ich eigentlich garnicht ich möchte nur große Zahlen übertragen und lernen wie das geht

Und ja für die Zahl 456 Dezimal bräuchte ich 2 Byte da sie größer als 255 ist ....?

postmaster-ino

Hi

Wenn Du die zu übertragende Variable als INT declarierst, werden 'von Haus aus' zwei Byte übertragen, da INT beim Arduino eben zwei Byte lang ist (-32tausendbatsch bis 32tausendbatsch, oder ohne Vorzeichen 0-65535).
'A' = 1 Zeichen
"A" = irgend eine Schweinerei, eine Erklärung kommt bestimmt und war die Tage bereits hier im Forum, hab's aber vergessen
"AB" = ein String, da mehr als ein Zeichen -> in Gänsefüßchen

Was stellen diese Zahlen dar, Die Du übertragen willst?

MfG

Tommy56

Da wollen wir Deinem Gedächtnis mal auf die Sprünge helfen: "A" ist auch eine Zeichenkette, bestehend aus 'A' und '\0'. Ich verwende bewußt das Wort String nicht, um nicht zur Verwechslung mit der Klasse String beizutragen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

agmue

"A" = irgend eine Schweinerei, eine Erklärung kommt bestimmt und war die Tage bereits hier im Forum, hab's aber vergessen
"AB" = ein String, da mehr als ein Zeichen -> in Gänsefüßchen
"A" = 'A' \0 = das Zeichen und die Zeilenendekennung, zusammen zwei Bytes, eine Zeichenkette!
"AB" = 'A' 'B' \0 = zwei Zeichen und die Zeilenendekennung, zusammen drei Bytes, eine Zeichenkette!

Tommy war schneller :)

Serenifly

Wenn Du die zu übertragende Variable als INT declarierst, werden 'von Haus aus' zwei Byte übertragen, da INT beim Arduino eben zwei Byte lang ist
Nicht wenn du stur nur write() machst. Schau dir die HardwareSerial Klasse an:
Code: [Select]

    inline size_t write(unsigned long n) { return write((uint8_t)n); }
    inline size_t write(long n) { return write((uint8_t)n); }
    inline size_t write(unsigned int n) { return write((uint8_t)n); }
    inline size_t write(int n) { return write((uint8_t)n); }


Man kann mit write() entweder ein Byte oder ein Array übertragen. Deshalb die Sache mit der Union

michael_x

Buchstaben brauche ich eigentlich garnicht ich möchte nur große Zahlen übertragen und lernen wie das geht

Und ja für die Zahl 456 Dezimal bräuchte ich 2 Byte da sie größer als 255 ist ....?
Eine Zahl wie 123456 in die zwei Teile 123 und 456 aufzuteilen, ist eine schlechte Idee, weil sie intern nicht so gespeichert ist.

union ist ein Hinweis

combie

Wenn ich Daten zwischen Arduinos, über die Serielle, schicken muss, ist der CmdMessenger die erste Wahl.
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

qualidat

1. du zerlegst mit MOD und DIV dein Integer in zwei Bytes
2. du erzeugst mit einem HASH oder ähnlichem Algorithmus eine 1-Byte-Prüfsumme
3. du sendest Startsymbol, Low-Byte, Hi-Byte, Prüfziffer, Stopsymbol

- auf Empfängerseite hälst du ein Array mit 5 Plätzen bereit
- jedes eintreffende Byte wird in das Feld mit dem höchsten Index (4) kopiert, zuvor werden die niedrigeren Felder je 1 Pos. weiter kopiert
- nach jedem empfangenen Byte prüfst du, ob Feld 0 = Startsymbol, Feld 3 = korrekt berechnete Prüfziffer aus Feldern 1 und 2, Feld 4 = Stopsymbol

wenn ja: Feld 1 u. 2 auslesen, Array komplett auf Null setzen ...

michael_x

Wenn ich Daten zwischen Arduinos, über die Serielle, schicken muss, ist der CmdMessenger die erste Wahl.
Wenn wir es schon aufblähen:
Code: [Select]
long wert = 234567;
Serial.println(wert);  // sendet in diesem Beispiel 8 Zeichen, die jeder lesen kann.

Hat den Vorteil, dass man zum Testen alles hernehmen kann, also Sender und Empfänger unabhängig und mit Standard-Mitteln ( SerialMonitor, hterm, ... ) testen kann.

postmaster-ino

Hi

Mit dem Nachteil erkauft, daß man diese 8 (ok, 6 Nutzzeichen) Zeichen wieder irgendwie zusammen kleben muß - zwar für jeden lesbar, aber ob die Arduinos damit auch was anfangen können - ich äußere Zweifel ;)

MfG

Serenifly

Strings einzulesen und in Zahlen zu konvertieren ist trivial. Es ist mehr Aufwand als gleich Binär-Daten zu senden, aber trotzdem sehr einfach.

Go Up