kostenloser Webspace werbefrei: lima-city


Bitstrom

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    s******n

    Hallo,
    weiß nicht ob dies das richtige Forum ist aber ich erkläre es mal.

    Ich brauche ein Prgm das aus einem Bitstrom, der Startbit, 8 Datenbits und
    Stoppbit enthält, zuverlässig die Daten extrahieren.Dazu wäre eben ein kleines
    Tool zu finden oder selber zu programmieren ( ist aber eher kompliziert). Zu beachten ist, dass der
    Bitstrom auch mitten in einem Datenpaket beginnen kann. Damit sich der
    Empfänger synchronisieren kann, werden deswegen erst Mal viele identische
    Zeichen geschickt (meist $AA = 10101010) und dann erst die eigentlichen
    Daten.

    Thx für Rückmeldungen
    Lg Seppelin
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hilfsprogramm sollte nicht allzu aufwendig sein. 2 Zustände:
    1. Suchen nach Startsequenzen
    2. Daten empfangen und in 10er Feld einsortieren. Sobald das Feld voll ist, werden die Datenbits irgendwohin übergeben.

    1. nutzt ein FIFO, in das einzelne Bits reingeschoben werden und dann geprüft wird, ob Synchronisierfolge anliegt. Sobald dem so ist, wird auf Zustand 2 übergeben, der die Daten dann extrahiert.

    Imho kleines C-Programm. Frage ist, wie Datenfluss hinein und hinaus gelangt, also ob man auf Dateien, Streams oder auf Geräte-Handles zurückgreift (je nach System ein großer Unterschied).

  4. Hallo Seppelin,

    es wäre interessant zu wissen, mit welcher Programmiersprache Du arbeitest und woher der Stream eigentlich kommt.
    Sofern Du mit C oder einer ähnlichen Programmiersprache arbeitest, kann ich Dir das erste Kapitel (Bit wizardry) aus dem Buch 'Matters Computational' (http://www.jjj.de/fxt/fxtbook.pdf) empfehlen. Dort sind viele Tricks und Code-Beispiele für die Verarbeitung von Daten auf Biteben zu finden.
    Und Du bist Dir auch sicher, dass Du Bits und nicht Bytes meinst?
    Falls es doch um Bytes geht, könnte man es (in C) folgendermaßen machen:
    #include <stdio.h>
    
    /*
     * fin: der Stream von dem gelesen wird
     * data: Zeiger auf den output buffer
     * 
     * Rückgabewert:
     * -1 bei Fehler, 0 bei Streamende, 8 bei erfolg (Anzahl gelesener Daten-Bytes)
     */
    int get_data_from_stream(FILE * fin, char data[8])
    {
        int c_in, idx;
    
        /* lese die Füllbytes vom Stream */
        do
        {
            c_in = fgetc(fin);
        }while(c_in == 0xAA);
        
        /* Wurde EOF gelesen? */
        if(c_in == EOF)
        {
            /* war es ein Fehler? */
            if(ferror(fin))
            {
                return -1;
            }
            else /* -> Ende des Stoms */
            {
                /* keine Daten */
                return 0;
            }
        }
        /*   prüfe auf Startbyte (ich nehme jetzt mal 0xBB): */
        else if(c_in != 0xBB)
        {
            /* Fehlerhafter Stream */
            return -1;
        }
    
        /* Das Startbyte ist korrekt, also lesen wir die Daten: */
    
        idx = 0;
        while((c_in = fgetc(fin))!=EOF && idx < 8)
        {
            data[idx] = c_in;
            idx++;
        }
    
        /* prüfe, ob 8 Bytes gelesen wurden: */
        if(idx!=8)
        {
            /* Fehlerhafter Stream */
            return -1;
        }
    
        /* Überprüfe das Stoppbyte (ich nehme mal 0xCC): */
        /* Da in obiger while-Schleife das fgetchar() for der Indexprüfung steht,
         * befindet es sich bereits in c_in. */
        if(c_in != 0xCC)
        {
            return -1;
        }
    
        return 8;
    }


    Dieser Code ist nicht getestet und kann Fehler enthalten, aber ich hoffe, dass er weiterhilft.

    [Edit: Korrekturen]

    Beitrag zuletzt geändert: 20.11.2010 15:14:47 von darkpandemic
  5. Autor dieses Themas

    s******n

    Thx für die schnellen Antworten.

    Ja ich meine Bits (8 Bits ),die als Startsequenz dienen sollen.
    Die einlese erfolgt über funkübertragung ( Satelitenprojekt der Schule^^).

    Ps. welches C verwendest du? C++?

    Beitrag zuletzt geändert: 19.11.2010 18:39:09 von seppelin
  6. Hallo Seppelin,

    erst eine kleine Anmerkung: 8 Bits = 1 Byte.
    Wenn die Nutzdaten 8 Bits sind, dann musst Du nur ein Byte lesen, d.h. nur ein fgetchar() anstelle der 8 in der Schleife.
    Das hier verwendete C ist ganz normales ISO-C bzw. ANSI-C, kein C++.
    Normalerweise arbeite ich mit gcc (mit Code::Blocks als IDE) oder VisualC++.
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!