- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 20

Thema: 16bit UART Übertragung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2014
    Beiträge
    13
    Hallo Peter,

    vielen Dank für die ausführliche und gute Erkärung! Jetz habe ich auch ziemlich verstanden wie der U(S)ART funktioniert.
    Ich verwende dann wohl UART also asynchron ohne extra Taktleitung mit diesen Stop-Bits.

    In welche Richtung sollte ich nun versuchen am Code etwas zu ändern? Wenn ich das richtig verstehe muss eine Zeit lang gewartet werden, bis das erste Byte übertragen ist bevor ich das zweite senden kann oder?
    Also sollte beim Empfänger sichergestellt sein, dass das erste Byte komplett eingegangen ist bevor das zweit angesetzt wird... puh

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von opc Beitrag anzeigen
    vielen Dank für die ausführliche und gute Erkärung! Jetz habe ich auch ziemlich verstanden wie der U(S)ART funktioniert.
    Ich verwende dann wohl UART also asynchron ohne extra Taktleitung mit diesen Stop-Bits.
    Richtig!
    Das U steht für universal, weil das Ding eben mehrere Modis kann.
    Es gibt auch UARTs, die können dann kein synchron.

    Zitat Zitat von opc Beitrag anzeigen
    In welche Richtung sollte ich nun versuchen am Code etwas zu ändern? Wenn ich das richtig verstehe muss eine Zeit lang gewartet werden, bis das erste Byte übertragen ist bevor ich das zweite senden kann oder?
    Also sollte beim Empfänger sichergestellt sein, dass das erste Byte komplett eingegangen ist bevor das zweit angesetzt wird... puh
    Zuerst einmal hast du ein Problem mit deinem Übertragungsprotokoll! Wenn du den Datenstrom loggst siehst du folgendes:
    .... Byte, Byte, Byte, Byte, Byte ....
    Tja, nun weiss aber keiner, und dein µC erst recht nicht, welche zwei Bytes zusammen gehören!
    Ein weiteres Problem ist noch, dass auch mal ein Byte verloren gehen kann oder gestört ist, dann wird eine andere ISR aufgerufen, welche die ganzen Fehler behandelt.

    Man braucht also etwas in der Form:
    .... Byte, sync, Byte, Byte, sync, Byte, Byte ....
    Dann weiss man, dass immer die zwei Bytes nach sync ein Paar bilden.
    Und wenn eine Byte verloren geht erkennt man das auch, dann fehlt entweder das sync oder nach sync kommt nur ein Byte.

    Jetzt kommt das nächste Problem:
    Du willst binäre Daten übertragen, die Datenwerte können also zwischen 0x00 und 0xFF liegen, das geht so nicht, weil du kein eindeutiges Zeichen für sync verwenden kannst.
    Das einfachste ist, die Daten als Hex-Werte zu übertragen, dazu gibt es auch eine Menge Funktionen in C, um diese umzuwandeln. Dann hast du nur die Werte '0' ... '9', 'A' ... 'F' belegt kannst aber, theoretisch alle anderen als sync verwenden.
    Der Nachteil bei ASCII-Hex ist halt, dass du doppelt so viele Zeichen senden musst, wie binär.
    Bei ASCII-Hex bietet es sich dann aber an, CR oder LF als Sync-Zeichen zu verwenden, diese werden bei Text als Zeilenabschluss verwendet. Ein weiterer Vorteil ist, dass du zum Testen ein Terminal anschliessen kannst (PC mit Terminal-Emulation) und alles im Klartext lesen kannst.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    HaWe
    Gast
    warum denn nicht gleich so wie ich es mache?
    array um 2 länger als Daten gebraucht werden, für TCP-Zwecke,
    also 2Bytes Daten + 2 TCP-Bytes = 4 Bytes

    uint8_t msgarr[4];

    msgarr[0] = 0xff;
    msgarr[1] = chksum(); // Zellen 2+3 aufaddieren, dann davon lowbyte bilden
    msgarr[2]= ... dein erstes Daten-Byte
    msgarr[3]= ... dein zweites Daten-Byte

    beim Empfang kontrollieren:

    if((msgarr[0]==0xff) && (msgarr[1]== chksum())) {...} // hier jetzt Bytes zu Int zusammensetzen und dann zum Display schicken.

    So geht es ganz easy auf Raspi und Arduino, da muss ich mich nicht um sync oder stop-Bits kümmern, das ist schon alles fix und fertig.

    Aber vlt ist ja tatsächlich dein AVR komplizierter.
    Geändert von HaWe (19.04.2016 um 08:51 Uhr) Grund: ( vergessen

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    29.12.2014
    Beiträge
    13
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    Man braucht also etwas in der Form:
    .... Byte, sync, Byte, Byte, sync, Byte, Byte ....
    Dann weiss man, dass immer die zwei Bytes nach sync ein Paar bilden.
    ok habe ich nun auch endlich verstanden. Da sonst endlos Bytes übertragen werden ohne dass der Empfänger weiß wo Anfang und Ende ist... so ist eine Addition natürlich sinnfrei (logisch). Ich dachte leider bislang, dass dies der UART bei den AVR´s automatisch erledigt, allerdings ging ich auch fälschlicherweise davon aus, dass ich den USART verwende (was mit jetzt aber klar ist).

    für das "Protokoll" hat HaWe ja eine gute Lösung für seinen Rpi/Arduino:


    Zitat Zitat von HaWe Beitrag anzeigen

    uint8_t msgarr[4];

    msgarr[0] = 0xff;
    msgarr[1] = chksum(); // Zellen 2+3 aufaddieren, dann davon lowbyte bilden
    msgarr[2]= ... dein erstes Daten-Byte
    msgarr[3]= ... dein zweites Daten-Byte

    beim Empfang kontrollieren:

    if((msgarr[0]==0xff) && msgarr[1]== chksum())) {...} // hier jetzt Bytes zu Int zusammensetzen und dann zum Display schicken.

    ich fange an den Sender mit dieser Methode aufzubauen und der Code sieht nun in diesem Ausschnitt folgendermaßen aus:

    uint8_t msgarr[4];

    msgarr[0] = 0xff;
    msgarr[1] = chksum(); // Zellen 2+3 aufaddieren, dann davon lowbyte bilden
    msgarr[2]= zahl >> 8;
    msgarr[3]= zahl & 0xff;

    daten_senden(msgarr);


    Eine Frage habe ich noch zur Funktion chksum()... was beinhaltet diese bzw. welche Zellen 2+3 sind hier gemeint? Die Inhalte 2+3 vom Array oderwie?

    Wenn mir das noch klar ist habe ich meinen Fehler "fehlendes Protokoll/Sync" beim Byte übertragen auch verstanden und mach mich an den Empfänger.

    Danke für euren Support! Hat mir rein vom Verständnis her schon viel gebracht und versuche dies umzusetzen.

  5. #5
    HaWe
    Gast
    genau, für chksum werden alle Array-Zellen ab [2] aufaddiert, 0 ist ja konstant und 1 ist ja die überstellte chksum, die es zu kontrollieren gilt

    bei mir geht die chksum so:

    Code:
    uint8_t calcchecksum(uint8_t array[]) {
       int32_t  sum=0;
       for(int i=2; i<MSGSIZE; ++i) sum+=(array[i]);
       return (sum & 0x00ff);
    }
    arrrrgggghhhh !! wieder keine Code Tags!
    bei dir wäre
    #define MSGSIZE 4



    auf Richtigkeit der Chksum rüfe ich per

    Code:
    bool checksumOK(uint8_t array[]) {
       return (calcchecksum(array)==array[1]);
    }
    http://www.mindstormsforum.de/viewto...tart=15#p67476

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo HaWe,
    Zitat Zitat von HaWe Beitrag anzeigen
    [CODE]uint8_t msgarr[4];

    msgarr[0] = 0xff;
    msgarr[1] = chksum(); // Zellen 2+3 aufaddieren, dann davon lowbyte bilden
    msgarr[2]= ... dein erstes Daten-Byte
    msgarr[3]= ... dein zweites Daten-Byte

    beim Empfang kontrollieren:

    if((msgarr[0]==0xff) && msgarr[1]== chksum())) {...} // hier jetzt Bytes zu Int zusammensetzen und dann zum Display schicken.

    [/CODE
    Und wie fängt sich das Ganze wieder, wenn z.B. ein Byte verloren geht?
    Sich also dann in msgarr[3] dein 0xff befindet.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  7. #7
    HaWe
    Gast
    dann wird der Array nicht ausgewertet sondern auf den nächsten Array gewartet (i.P. handshake).
    siehe meinen sourcecode für Raspi und Arduino (codes fast fast identisch)!

    http://www.mindstormsforum.de/viewto...p=67907#p67815

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von HaWe Beitrag anzeigen
    dann wird der Array nicht ausgewertet sondern auf den nächsten Array gewartet (i.P. handshake).
    siehe meinen sourcecode für Raspi und Arduino (codes fast fast identisch)!

    http://www.mindstormsforum.de/viewto...p=67907#p67815
    Eben, auf diesen Teil hast du den TO nicht hingewiesen

    Bei mir enden solche Protokollhandler immer als State Machine.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  9. #9
    HaWe
    Gast
    ja und? Mach dus doch wie du willst!
    außerdem hatte ich bereits mehrfach den TO auf meinen Code hingewiesen und meinen Code verlinkt als Erklärung, samt Kommentaren.

Ähnliche Themen

  1. RFM12 und AVR Funkmodul mit Uart Übertragung
    Von Ripper121 im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 15.10.2010, 13:21
  2. uart übertragung 1. bit immer 1
    Von tanger im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 08.03.2008, 10:08
  3. 16bit int über UART versenden
    Von pongi im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 30.07.2007, 18:18
  4. UART Problem mit Übertragung
    Von ricola im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 24.10.2005, 09:39
  5. Wirres Zeug mit C bei der UART übertragung von µC zu PC
    Von MaN im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 01.09.2005, 18:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests