08 March, 2014

CRC

CRC Receiver

#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


struct frame
{
    char info[1];
    char rem[1];
}r;

void dispBits(char c);
int getBit(char c,int pos);
char setBit(char c,int pos);
char unsetBit(char c,int pos);

main()
{
    int tmp;
    int fd,file1;

    int d=13;   // div by 1101 (13)

    if((fd=open("testfile",O_RDONLY))<0)
        perror("fifo open failed");

    if((file1=open("output.txt",O_WRONLY))<0)
        perror("file open failed");

    while(1)
    {
        if((tmp=read(fd,r.info,1))>0)
        {
            int i,j,tmp;
            char ans=0,trem;
           
            if((tmp=read(fd,r.rem,1))<=0)
                break;
           
            //printf("\n receive data : ");
            //dispBits(r.info[0]);
           
            //printf("\t remainder : ");
            //dispBits(r.rem[0]);
           
            trem=0;
           
            for(i=1;i<=8+3;i++)  //8 data bit and 3 for 000
            {
                trem=trem<<1;  //for reminder
                ans=ans<<1;
                if(i<=8)  //data part
                {
                    if(getBit(r.info[0],i)==1)
                        trem=setBit(trem,8);
                    else
                        trem=unsetBit(trem,8);   
                }
                else    // last 3 bit of received remainder
                {
                    if(getBit(r.rem[0],i-3)==1)
                        trem=setBit(trem,8);
                    else
                        trem=unsetBit(trem,8);    
                }
               
                if(getBit(trem,5)==1)  //if divide then
                {
                    trem=trem^d;
                    ans=setBit(ans,8);
                }   
            }
           
            printf("\n [receiver] division ans : ");
            dispBits(ans);
           
            printf("\t remainder : ");
            dispBits(trem);
           
            if(trem==0)
            {
                if((tmp=write(file1,r.info,1))<=0)      //send char
                    perror("message write failed");
            }
            else
            {
                printf("\nERROR :: Error in Received data");
            }
        }
    }
    printf("\n");
}


void dispBits(char c)
{
    int no=128,i;

    for(i=0;i<8;i++)
    {
        if((no&c)>0)
            printf("1");
        else
            printf("0");
        no=no>>1;
    }
}

int getBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    if((c&no)>0)
        return 1;
    else
        return 0;

}

char setBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    c=c|no;

    return c;
}
char unsetBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    no=~no;

    return c&no;
}



CRC Sender


#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct frame
{
    char info[1];
    char rem[1];
}s;

void dispBits(char c);
int getBit(char c,int pos);
char setBit(char c,int pos);
char unsetBit(char c,int pos);

main()
{
    int fd,file1;
   
    int d=13;   // div by 1101 (13)

    if((fd=open("testfile",O_WRONLY))<0)
        perror("fifo open failed");

    if((file1=open("input.txt",O_RDONLY))<0)
        perror("file open failed");

   
    while(1)
    {
        int i,j,tmp;
        char ans=0;

        if((tmp=read(file1,s.info,1))<=0)
            break;

        if(s.info[0]==10)
            break;
       
        printf("\n\n Input : ");
        dispBits(s.info[0]);
       
        s.rem[0]=0;
       
        for(i=1;i<=8+3;i++)  //8 data bit and 3 for 000
        {
            s.rem[0]=s.rem[0]<<1;  //for reminder
            ans=ans<<1;   
           
            if(i<=8)  //data part
            {
                if(getBit(s.info[0],i)==1)
                    s.rem[0]=setBit(s.rem[0],8);
                else
                    s.rem[0]=unsetBit(s.rem[0],8);   
            }
            else    // last 000
            {
                s.rem[0]=unsetBit(s.rem[0],8); 
            }
           
            if(getBit(s.rem[0],5)==1)  //if divide then
            {
                ans=setBit(ans,8);
                s.rem[0]=s.rem[0]^d;
            }   
        }
       
        printf("\n [sender] division ans : ");
        dispBits(ans);
       
        printf("\t remainder : ");
        dispBits(s.rem[0]);
       
        if((tmp=write(fd,s.info,1))<=0)      //send char
                    perror("message write failed");
        if((tmp=write(fd,s.rem,1))<=0)         //send remainder
                    perror("message write failed");
       
    }
    printf("\n");
}

void dispBits(char c)
{
    int no=128,i;

    for(i=0;i<8;i++)
    {
        if((no&c)>0)
            printf("1");
        else
            printf("0");
        no=no>>1;
    }
}

int getBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    if((c&no)>0)
        return 1;
    else
        return 0;

}

char setBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    c=c|no;

    return c;
}
char unsetBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    no=~no;

    return c&no;
}