Sida 4 av 5

Re: Dekoda pulståg i Audacity

Postat: 10 december 2018, 21:28:14
av Magnus_K
Provar så här i stället. Nu är jag nära!

Detta är mitt binära meddelande:
110000101100001100100000000000000000000011111010000

Om man avkodar bitströmmen (längst ner i inlägget) mha sanningstabellen:

Kod: Markera allt

A B O
0 0 0
0 1 1
1 0 0
1 1 1
så verkar det stämma.
Frågan är då. Finns det något program som kan hjälpa mig så jag slipper göra det här manuellt?

110011000110011001100011001100110011001100110011001100110011001100101100110001101010011000101010110100110011001101010011001010101101001010101011010010101011001101001010101101001011001010101010101010101010101010101010101010110101010100011001010101011001101001100110011001101001011000

Re: Dekoda pulståg i Audacity

Postat: 10 december 2018, 21:29:53
av Kulla
Sigrok, kanske kolla om protokollet finns eller du får skapa den själv.

https://sigrok.org/wiki/Protocol_decoders

Re: Dekoda pulståg i Audacity

Postat: 10 december 2018, 21:39:02
av Klas-Kenny
Med den där sanningstabellen kan du ju helt enkelt plocka bort varannan bit, så har du svaret.. :)

Eller så kan du spendera fem minuter på att skriva ett program som avkodar..

https://onlinegdb.com/ryMkkUhyE :vissla:

Re: Dekoda pulståg i Audacity

Postat: 10 december 2018, 22:13:21
av Magnus_K
På ren svenska, fan vilket geni du är Klas-Kenny!
Trodde absolut inte att du skrivit ihop något liknande, utan bara postade en länk!

Är det ok om jag stjäl den koden och försöker göra ett program i RPin där jag bara kan mata in pulståget och ut spottar den resultatet. Kan vara en halvklurig övning för mig att göra.

Tack än en gång! Blev extra glad när jag insåg att det stämde också :D

Re: Dekoda pulståg i Audacity

Postat: 10 december 2018, 22:21:07
av Klas-Kenny
Självklart får du göra vad du vill med koden.
Den är inte optimal på något sätt, men den är enkel och gick snabbt att skriva. :D

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 08:38:21
av Magnus_K
Tack :tumupp:

Jag slaktade den lite igår... Läste lite hur man använder getopt().
Trodde det gick relativt bra men ju mer jag rättar till, desto fler kompileringsfel.
Har lite problem att flytta text mellan RPin och EF så här kommer bara koden. Ska jobba på att få över kompileringsfelen också, men det är lite många i nuläget.
Nu så, nu är kompileringsfelen nedanför koden.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

void print_usage() {
        printf("Usage: binDecoderv1 -b <bin> | binDecoderv1 -h\n");
        exit(2);
}

void main(int argc, char **argv) {

    if (argc < 2) {
	    print_usage();
    }

    int option;
    int bflag = 0;
    int hflag = 0;

    while ((option = getopt(argc, argv, "b:h")) !=-1) {
            switch (option) {
                    case 'b' :
                            if (bflag) {
                                    print_usage();
                            } else {
                                    bflag++;
                                    print_decoded_result(atoi(optarg));
                            }
                            break;
                    case 'h' :
                            if (hflag) {
                                    print_usage();
                            } else {
                                    printf("Enter pulsetrain and get it decoded!");
                            }
                            break;
                    default :
                            print_usage();
            }
    }
}

int print_decoded_result(char binary) {
    
    char b[] = binary;
    
    for(int i=0; i<sizeof(b); i+=2) {
        
        if(b[i] == '0') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        } else if(b[i] == '1') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        }
    }
    printf("\n");
    return 0;
}

Kod: Markera allt

binDecoderv1.c: In function ‘main’:
binDecoderv1.c:27:37: warning: implicit declaration of function ‘print_decoded_result’ [-Wimplicit-function-declaration]
                                     print_decoded_result(atoi(optarg));
                                     ^~~~~~~~~~~~~~~~~~~~
binDecoderv1.c: At top level:
binDecoderv1.c:43:5: error: conflicting types for ‘print_decoded_result’
 int print_decoded_result(char binary) {
     ^~~~~~~~~~~~~~~~~~~~
binDecoderv1.c:43:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
 int print_decoded_result(char binary) {
 ^~~
binDecoderv1.c:27:37: note: previous implicit declaration of ‘print_decoded_result’ was here
                                     print_decoded_result(atoi(optarg));
                                     ^~~~~~~~~~~~~~~~~~~~
binDecoderv1.c: In function ‘print_decoded_result’:
binDecoderv1.c:45:16: error: invalid initializer
     char b[] = binary;
                ^~~~~~

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 08:54:29
av Klas-Kenny
Inte provkört programmet, men det kompilerar i alla fall. :)

Flyttade main() till sist i programmet (funktionen print_decoded_result() var annars inte deklarerad innan den användes), bytte namn på variabeln binary till bara b och tog bort det misslyckade försöket att kopiera binary till b (för att göra som du försökte hade det krävt att allokera minne till b med malloc, sen kopiera med memcpy. Arrayhantering är inte alltid helt trivialt i C), samt lade till variabel hflag.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
 
void print_usage() {
        printf("Usage: binDecoderv1 -b <bin> | binDecoderv1 -h\n");
        exit(2);
}
 

 
int print_decoded_result(char b[]) {
   
    for(int i=0; i<sizeof(b); i+=2) {
       
        if(b[i] == '0') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        } else if(b[i] == '1') {
            if(b[i+1] == '0')
                printf("0");
            else if(b[i+1] == '1')
                printf("1");
        }
    }
    printf("\n");
    return 0;
}

void main(int argc, char **argv) {
 
    if (argc < 2) {
        print_usage();
    }
 
    int option;
    int bflag, hflag = 0;
 
    while ((option = getopt(argc, argv, "b:h")) !=-1) {
            switch (option) {
                    case 'b' :
                            if (bflag) {
                                    print_usage();
                            } else {
                                    bflag++;
                                    print_decoded_result(atoi(optarg));
                            }
                            break;
                    case 'h' :
                            if (hflag) {
                                    print_usage();
                            } else {
                                    printf("Enter pulsetrain and get it decoded!");
                            }
                            break;
                    default :
                            print_usage();
            }
    }
}

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 09:14:57
av Magnus_K
Försökte enbart göra ändringarna genom din text, blir lättare att förstå felen då. Nu kompilerar det med ett par varningar men får Segmenteringsfel när jag försöker tex ./binDecoderv1 -b 10101101010101.

Ska kika mer på det lite senare men roligt att se svaren om man bara skriver ./binDecoderv1 eller ./binDecoderv1 -h :)

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 11:35:14
av Klas-Kenny
Ser felet nu, du vill inte ha atoi(optarg) eftersom du vill ha en sträng till print_decoded_result(), inte strängen omvandlas till integer.

Skicka optarg direkt istället.

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 11:44:41
av Magnus_K
Det löste det mesta! :tumupp:

Det enda den inte vill förstå nu (tror jag), det är den egentliga storleken på b[].
Kör jag tex ./binDecoder -b 110101010101 så får jag bara tillbaka 11. Den verkar enbart uppfatta b som storlek 1, och kör for-loopen endast en gång.

EDIT: Tror det är jag som rör ihop det. Det blev lite dumt att döpa både option till 'b' samt använda det som variabelnamn för det binära pulståget.

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 14:46:47
av Magnus_K
Nej, får inte ihop det riktigt. Förstår inte vad det är för värde som lägger sig i binary[]. Lägger sig varje bit som ett element?
Så här ser koden ut nu. Med kompileringsvarningen nedan.

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

void print_usage() {
        printf("Usage: binDecoderv1 -b <bin> | binDecoderv1 -h\n");
        exit(2);
}


int print_decoded_result(char binary[]) {
    
    //binary = sizeof(b) / sizeof(b[0]);
 
    for(int i=0; i<sizeof(binary); i+=2) {
        
        if(binary[i] == '0') {
            if(binary[i+1] == '0')
                printf("0");
            else if(binary[i+1] == '1')
                printf("1");
        } else if(binary[i] == '1') {
            if(binary[i+1] == '0')
                printf("0");
            else if(binary[i+1] == '1')
                printf("1");
        }
    }
    printf("\n");
    return 0;
}

void main(int argc, char **argv) {

    if (argc < 2) {
	    print_usage();
    }

    int option;
    int bflag = 0;
    int hflag = 0;

    while ((option = getopt(argc, argv, "b:h")) !=-1) {
            switch (option) {
                    case 'b' :
                            if (bflag) {
                                    print_usage();
                            } else {
                                    bflag++;
                                    print_decoded_result(optarg);
                            }
                            break;
                    case 'h' :
                            if (hflag) {
                                    print_usage();
                            } else {
				    hflag++;
                                    printf("Enter pulsetrain and get it decoded!\n");
                            }
                            break;
                    default :
                            print_usage();
            }
    }
}

Kod: Markera allt

binDecoderv1.c: In function ‘print_decoded_result’:
binDecoderv1.c:15:26: warning: ‘sizeof’ on array function parameter ‘binary’ will return size of ‘char *’ [-Wsizeof-array-argument]
     for(int i=0; i<sizeof(binary); i+=2) {
                          ^
binDecoderv1.c:11:31: note: declared here
 int print_decoded_result(char binary[]) {
                               ^~~~~~

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 17:04:00
av adent
Nu vet jag inte riktigt var optarg kommer ifrån.

Felet är att sizeof(binary) inte returnerar strängens/arrayens längd utan storleken för en pekare istället.

Testa med: strlen(binary) istället för sizeof(binary). Kanske behöver du inkludera <string.h> oxo.

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 17:56:25
av Magnus_K
Snyggt adent :tumupp:
Jag som testat strlen i olika varianter men inte så.

Programmet räknar fortfarande inte riktigt så det är fortfarande något fel.
Jag testade att göra printf(optarg); och då skriver den ut exakt det pulståget som jag matade in. Med andra ord får funktionen print_decoded_result(); det den ska.
Testade sen att i den funktionen skriva printf(strlen(binary)); men får en drös varningar då om pekare och annat. Tyvärr inte möjlighet att kopiera meddelandet nu.

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 20:49:58
av Klas-Kenny
printf("%d",strlen(binary));

Kan inte ge printf en integer direkt...

Printf tar en sträng som första argument. Och en sträng i C är en pekare till en char-array.
Så ger du den en integer kommer den skriva ut vad som råkar finnas på den adressen som integerns tal är. Vilket sannolikt bara blir skräptecken.

Re: Dekoda pulståg i Audacity

Postat: 11 december 2018, 21:13:22
av Magnus_K
Oj, ja då blir det tokigt.
Får tillbaka 11.