CRC user defined program

Dependents:   AESslave_modified_test

Committer:
ajeet3004
Date:
Tue Jun 20 05:37:49 2017 +0000
Revision:
0:b1f3adc77886
CRC user defined program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ajeet3004 0:b1f3adc77886 1 #include "mbed.h"
ajeet3004 0:b1f3adc77886 2 #include "crc.h"
ajeet3004 0:b1f3adc77886 3 Serial output(USBTX,USBRX); //USB serial to print the data in the console
ajeet3004 0:b1f3adc77886 4 char result1[18]; //To store the character format of the CRC bit
ajeet3004 0:b1f3adc77886 5 int binary1[256]; //To store the binary data in integer type
ajeet3004 0:b1f3adc77886 6 char binary2[256]; //To store the binary data in chracter type
ajeet3004 0:b1f3adc77886 7 int generator[]= {1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0}; //CRC generator
ajeet3004 0:b1f3adc77886 8 int v,v1;
ajeet3004 0:b1f3adc77886 9
ajeet3004 0:b1f3adc77886 10
ajeet3004 0:b1f3adc77886 11 //Function for generating CRC and transmitting it
ajeet3004 0:b1f3adc77886 12 char* crcCheck_transmit(char* targetChar) //for transmission the data from gateway to slave device with crc
ajeet3004 0:b1f3adc77886 13 {
ajeet3004 0:b1f3adc77886 14 int i1,j1,k1,l1,h1;
ajeet3004 0:b1f3adc77886 15
ajeet3004 0:b1f3adc77886 16
ajeet3004 0:b1f3adc77886 17
ajeet3004 0:b1f3adc77886 18 v=0,v1=0;
ajeet3004 0:b1f3adc77886 19 for(h1=0; h1<16; h1++) { //loop for binary printing
ajeet3004 0:b1f3adc77886 20 printBinary(targetChar[h1]);
ajeet3004 0:b1f3adc77886 21 output.printf(" - ");
ajeet3004 0:b1f3adc77886 22 }
ajeet3004 0:b1f3adc77886 23 //output.printf("%d",sizeof(f));
ajeet3004 0:b1f3adc77886 24 // output.printf("\n The data to be analyzed is : ");
ajeet3004 0:b1f3adc77886 25 int frame[v+16];
ajeet3004 0:b1f3adc77886 26 for(h1=0; h1<v; h1++) { //storing the binary data in frame array
ajeet3004 0:b1f3adc77886 27 // output.printf("%d",binary1[h1]);
ajeet3004 0:b1f3adc77886 28 frame[h1]=binary1[h1];
ajeet3004 0:b1f3adc77886 29 }
ajeet3004 0:b1f3adc77886 30 //frame[2]=0;
ajeet3004 0:b1f3adc77886 31 /* output.printf("\n The value of v is : %d ",v); //Printing the value of V i.e total binary no.
ajeet3004 0:b1f3adc77886 32
ajeet3004 0:b1f3adc77886 33 output.printf("\n Sender Side:");
ajeet3004 0:b1f3adc77886 34 output.printf("\n Frame: ");*/
ajeet3004 0:b1f3adc77886 35 /* for(i1=0; i1<v; i1++) { // total binary stream printing
ajeet3004 0:b1f3adc77886 36 output.printf("%d",frame[i1]);
ajeet3004 0:b1f3adc77886 37 }
ajeet3004 0:b1f3adc77886 38 output.printf("\n Generator : "); */ // generator for CRC checking
ajeet3004 0:b1f3adc77886 39 /* for(i1=0; i1<16; i1++) {
ajeet3004 0:b1f3adc77886 40 output.printf("%d",generator[i1]);
ajeet3004 0:b1f3adc77886 41 }*/
ajeet3004 0:b1f3adc77886 42
ajeet3004 0:b1f3adc77886 43 //Append 0's
ajeet3004 0:b1f3adc77886 44 int rs1=16-1;
ajeet3004 0:b1f3adc77886 45 for (i1=v; i1<v+rs1; i1++) { //appending the zeros to the data for calculating the crc
ajeet3004 0:b1f3adc77886 46 frame[i1]=0;
ajeet3004 0:b1f3adc77886 47 }
ajeet3004 0:b1f3adc77886 48
ajeet3004 0:b1f3adc77886 49 int temp2[v+16];
ajeet3004 0:b1f3adc77886 50 for(i1=0; i1<v+16; i1++) { // copying the data from one array to another array
ajeet3004 0:b1f3adc77886 51 temp2[i1]=frame[i1];
ajeet3004 0:b1f3adc77886 52 }
ajeet3004 0:b1f3adc77886 53
ajeet3004 0:b1f3adc77886 54 /* output.printf("\n Message after appending 0's :");
ajeet3004 0:b1f3adc77886 55 for(i1=0; i1<v+rs1; i1++) { //printing the data after appending zeros
ajeet3004 0:b1f3adc77886 56 output.printf("%d",temp2[i1]);
ajeet3004 0:b1f3adc77886 57 }*/
ajeet3004 0:b1f3adc77886 58
ajeet3004 0:b1f3adc77886 59 //Division
ajeet3004 0:b1f3adc77886 60 for(i1=0; i1<v; i1++) { //CRC generating through division operation
ajeet3004 0:b1f3adc77886 61 j1=0;
ajeet3004 0:b1f3adc77886 62 k1=i1;
ajeet3004 0:b1f3adc77886 63 //check whether it is divisible or not
ajeet3004 0:b1f3adc77886 64 if (temp2[k1]>=generator[j1]) {
ajeet3004 0:b1f3adc77886 65 for(j1=0,k1=i1; j1<16; j1++,k1++) {
ajeet3004 0:b1f3adc77886 66 if((temp2[k1]==1 && generator[j1]==1) || (temp2[k1]==0 && generator[j1]==0)) {
ajeet3004 0:b1f3adc77886 67 temp2[k1]=0;
ajeet3004 0:b1f3adc77886 68 } else {
ajeet3004 0:b1f3adc77886 69 temp2[k1]=1;
ajeet3004 0:b1f3adc77886 70 }
ajeet3004 0:b1f3adc77886 71 }
ajeet3004 0:b1f3adc77886 72 }
ajeet3004 0:b1f3adc77886 73 }
ajeet3004 0:b1f3adc77886 74
ajeet3004 0:b1f3adc77886 75 //CRC
ajeet3004 0:b1f3adc77886 76 int crc[16];
ajeet3004 0:b1f3adc77886 77 for(i1=0,j1=v; i1<rs1; i1++,j1++) { // storing CRC bits in CRC array
ajeet3004 0:b1f3adc77886 78 crc[i1]=temp2[j1];
ajeet3004 0:b1f3adc77886 79 }
ajeet3004 0:b1f3adc77886 80
ajeet3004 0:b1f3adc77886 81 /*output.printf("\n CRC bits: ");
ajeet3004 0:b1f3adc77886 82 for(i1=0; i1<rs1; i1++) { //printing CRC bits
ajeet3004 0:b1f3adc77886 83 output.printf("%d",crc[i1]);
ajeet3004 0:b1f3adc77886 84 }*/
ajeet3004 0:b1f3adc77886 85
ajeet3004 0:b1f3adc77886 86 //output.printf("\n Transmitted Frame: ");
ajeet3004 0:b1f3adc77886 87 int tf2[v+16];
ajeet3004 0:b1f3adc77886 88 char tf3[v+16];
ajeet3004 0:b1f3adc77886 89 for(i1=0; i1<v; i1++) { // copying the data from one to another
ajeet3004 0:b1f3adc77886 90 tf2[i1]=frame[i1];
ajeet3004 0:b1f3adc77886 91 }
ajeet3004 0:b1f3adc77886 92 for(i1=v,j1=0; i1<v+rs1; i1++,j1++) { // Adding CRC bits to the data
ajeet3004 0:b1f3adc77886 93 tf2[i1]=crc[j1];
ajeet3004 0:b1f3adc77886 94 }
ajeet3004 0:b1f3adc77886 95 /* for(i1=0; i1<v+rs1; i1++) { // printing the data after adding the CRC bits to the data
ajeet3004 0:b1f3adc77886 96 output.printf("%d",tf2[i1]);
ajeet3004 0:b1f3adc77886 97 }*/
ajeet3004 0:b1f3adc77886 98
ajeet3004 0:b1f3adc77886 99 tf2[v+rs1]=0;
ajeet3004 0:b1f3adc77886 100
ajeet3004 0:b1f3adc77886 101 /* output.printf("\n The final data to be sent is : "); // printing the Final data
ajeet3004 0:b1f3adc77886 102 for(i1=0; i1<=v+rs1; i1++) {
ajeet3004 0:b1f3adc77886 103 output.printf("%d",tf2[i1]);
ajeet3004 0:b1f3adc77886 104 }*/
ajeet3004 0:b1f3adc77886 105
ajeet3004 0:b1f3adc77886 106 /* for(i1=0;i1<7;i1++)
ajeet3004 0:b1f3adc77886 107 {
ajeet3004 0:b1f3adc77886 108 tf2[i1]=1;
ajeet3004 0:b1f3adc77886 109 }
ajeet3004 0:b1f3adc77886 110 for(i1=136;i1<144;i1++)
ajeet3004 0:b1f3adc77886 111 {
ajeet3004 0:b1f3adc77886 112 tf2[i1]=1;
ajeet3004 0:b1f3adc77886 113 }*/
ajeet3004 0:b1f3adc77886 114 output.printf("\n The final data to be sent is : "); // printing the Final data
ajeet3004 0:b1f3adc77886 115 for(i1=0; i1<=v+rs1; i1++) {
ajeet3004 0:b1f3adc77886 116 output.printf("%d",tf2[i1]);
ajeet3004 0:b1f3adc77886 117 }
ajeet3004 0:b1f3adc77886 118 for(i1=0; i1<=v+rs1; i1++) {
ajeet3004 0:b1f3adc77886 119 charBinary(tf2[i1]);
ajeet3004 0:b1f3adc77886 120 }
ajeet3004 0:b1f3adc77886 121 /* output.printf("\n The final data to be sent is : ");
ajeet3004 0:b1f3adc77886 122 for(i1=0; i1<=v+rs1; i1++) {
ajeet3004 0:b1f3adc77886 123 output.printf("%c",binary2[i1]);
ajeet3004 0:b1f3adc77886 124 }*/
ajeet3004 0:b1f3adc77886 125 printChar(binary2);
ajeet3004 0:b1f3adc77886 126
ajeet3004 0:b1f3adc77886 127 char* str=result1;
ajeet3004 0:b1f3adc77886 128 //result1[18]='!';
ajeet3004 0:b1f3adc77886 129 output.printf("\n check %s ", str);
ajeet3004 0:b1f3adc77886 130 v=0,v1=0;
ajeet3004 0:b1f3adc77886 131 return result1;
ajeet3004 0:b1f3adc77886 132 }
ajeet3004 0:b1f3adc77886 133
ajeet3004 0:b1f3adc77886 134
ajeet3004 0:b1f3adc77886 135
ajeet3004 0:b1f3adc77886 136 //Function for CRC Checksum
ajeet3004 0:b1f3adc77886 137 int crcCheck_receive(char a1[])
ajeet3004 0:b1f3adc77886 138 {
ajeet3004 0:b1f3adc77886 139 int i,j,k,l; //Variable required for CRC checksum
ajeet3004 0:b1f3adc77886 140 int rs=15; //Value of should be N - 1 if the generator is of N bits
ajeet3004 0:b1f3adc77886 141 v=0;
ajeet3004 0:b1f3adc77886 142 /*output.printf("\n Receiver side : ");
ajeet3004 0:b1f3adc77886 143 output.printf("\n Received Frame: ");*/
ajeet3004 0:b1f3adc77886 144
ajeet3004 0:b1f3adc77886 145 //For loop to convert the given data to binary form
ajeet3004 0:b1f3adc77886 146 for(int m=0; m<18; m++) {
ajeet3004 0:b1f3adc77886 147 printBinary(a1[m]);
ajeet3004 0:b1f3adc77886 148 output.printf("-");
ajeet3004 0:b1f3adc77886 149 }
ajeet3004 0:b1f3adc77886 150
ajeet3004 0:b1f3adc77886 151 //For loop to print the binary form of the data
ajeet3004 0:b1f3adc77886 152 /* for(i=0; i<v; i++) {
ajeet3004 0:b1f3adc77886 153 output.printf("%d",binary1[i]);
ajeet3004 0:b1f3adc77886 154 }*/
ajeet3004 0:b1f3adc77886 155 v=v-16;
ajeet3004 0:b1f3adc77886 156 int tf[v+16]; //Variable to store the binsry form of the data
ajeet3004 0:b1f3adc77886 157
ajeet3004 0:b1f3adc77886 158 //For loop to store the bianry form of data into tf
ajeet3004 0:b1f3adc77886 159 for(i=0; i<v+rs; i++) {
ajeet3004 0:b1f3adc77886 160 tf[i]=binary1[i];
ajeet3004 0:b1f3adc77886 161 }
ajeet3004 0:b1f3adc77886 162
ajeet3004 0:b1f3adc77886 163 /* output.printf("\n");
ajeet3004 0:b1f3adc77886 164 output.printf("The data to be Analyzed on the receiving side : ");*/
ajeet3004 0:b1f3adc77886 165
ajeet3004 0:b1f3adc77886 166 //For loop to print the data to be analyzed
ajeet3004 0:b1f3adc77886 167 /*for(i=0; i<v+rs; i++) {
ajeet3004 0:b1f3adc77886 168 output.printf("%d",tf[i]);
ajeet3004 0:b1f3adc77886 169 }*/
ajeet3004 0:b1f3adc77886 170
ajeet3004 0:b1f3adc77886 171 int temp[v+16];
ajeet3004 0:b1f3adc77886 172 int temp2[v+16];
ajeet3004 0:b1f3adc77886 173 for(i=0; i<v+rs; i++) {
ajeet3004 0:b1f3adc77886 174 temp[i]=tf[i];
ajeet3004 0:b1f3adc77886 175 }
ajeet3004 0:b1f3adc77886 176 output.printf("\n The value before operation is :");
ajeet3004 0:b1f3adc77886 177 for(i=0; i<v+rs; i++) {
ajeet3004 0:b1f3adc77886 178 output.printf("%d",temp[i]);
ajeet3004 0:b1f3adc77886 179 }
ajeet3004 0:b1f3adc77886 180 //Division
ajeet3004 0:b1f3adc77886 181 for(i=0; i<v; i++) {
ajeet3004 0:b1f3adc77886 182 j=0;
ajeet3004 0:b1f3adc77886 183 k=i;
ajeet3004 0:b1f3adc77886 184 if (temp[k]>=generator[j]) {
ajeet3004 0:b1f3adc77886 185 for(j=0,k=i; j<16; j++,k++) {
ajeet3004 0:b1f3adc77886 186 if(temp[k] == generator[j]) { //If the data bit and generator bit are same
ajeet3004 0:b1f3adc77886 187 temp[k]=0; //Result is 0
ajeet3004 0:b1f3adc77886 188 } else { //If the data bit and generator bit are not same
ajeet3004 0:b1f3adc77886 189 temp[k]=1; //Result is 1
ajeet3004 0:b1f3adc77886 190 }
ajeet3004 0:b1f3adc77886 191 }
ajeet3004 0:b1f3adc77886 192 }
ajeet3004 0:b1f3adc77886 193 }
ajeet3004 0:b1f3adc77886 194 output.printf("\n The value after operation is :");
ajeet3004 0:b1f3adc77886 195 for(i=0; i<v+rs; i++) {
ajeet3004 0:b1f3adc77886 196 output.printf("%d",temp[i]);
ajeet3004 0:b1f3adc77886 197 }
ajeet3004 0:b1f3adc77886 198 output.printf("\n Reaminder: ");
ajeet3004 0:b1f3adc77886 199 int rrem[16]; //Char array to store the remainder of the CRC checksum
ajeet3004 0:b1f3adc77886 200
ajeet3004 0:b1f3adc77886 201 //For loop to store the remainder
ajeet3004 0:b1f3adc77886 202 for (i=v,j=0; i<v+rs; i++,j++) {
ajeet3004 0:b1f3adc77886 203 rrem[j]= temp[i];
ajeet3004 0:b1f3adc77886 204 }
ajeet3004 0:b1f3adc77886 205
ajeet3004 0:b1f3adc77886 206 //For loop to print the remainder
ajeet3004 0:b1f3adc77886 207 for(i=0; i<rs; i++) {
ajeet3004 0:b1f3adc77886 208 output.printf("%d",rrem[i]);
ajeet3004 0:b1f3adc77886 209 }
ajeet3004 0:b1f3adc77886 210
ajeet3004 0:b1f3adc77886 211 int flag=0; //Variable to store the status of the flag
ajeet3004 0:b1f3adc77886 212
ajeet3004 0:b1f3adc77886 213 //For loop to check the remainder
ajeet3004 0:b1f3adc77886 214 for(i=0; i<rs; i++) {
ajeet3004 0:b1f3adc77886 215 if(rrem[i]!=0) { //If remainder bit is not equal to 0
ajeet3004 0:b1f3adc77886 216 flag=1; //Set the flag value as 1
ajeet3004 0:b1f3adc77886 217 break;
ajeet3004 0:b1f3adc77886 218 }
ajeet3004 0:b1f3adc77886 219 }
ajeet3004 0:b1f3adc77886 220
ajeet3004 0:b1f3adc77886 221 if(flag==0) { //if flag value is 0
ajeet3004 0:b1f3adc77886 222 //output.printf("\n Since Remainder Is 0 Hence Message Transmitted From Sender To Receriver Is Correct");
ajeet3004 0:b1f3adc77886 223 return 0; //Return 0
ajeet3004 0:b1f3adc77886 224
ajeet3004 0:b1f3adc77886 225
ajeet3004 0:b1f3adc77886 226 } else { //if flag value is not zero
ajeet3004 0:b1f3adc77886 227 // output.printf(" \n Since Remainder Is Not 0 Hence Message Transmitted From Sender To Receriver Contains Error");
ajeet3004 0:b1f3adc77886 228 return 1; //return 1
ajeet3004 0:b1f3adc77886 229 }
ajeet3004 0:b1f3adc77886 230 v=0;
ajeet3004 0:b1f3adc77886 231 }
ajeet3004 0:b1f3adc77886 232
ajeet3004 0:b1f3adc77886 233 //Function to print the binary format of the data which takes char c as a parameter
ajeet3004 0:b1f3adc77886 234 void printBinary(char c)
ajeet3004 0:b1f3adc77886 235 {
ajeet3004 0:b1f3adc77886 236
ajeet3004 0:b1f3adc77886 237 for (int i = 7; i >= 0; --i) {
ajeet3004 0:b1f3adc77886 238 int x = ((c & (1 << i))? 1 : 0);
ajeet3004 0:b1f3adc77886 239 output.printf("%d",x);
ajeet3004 0:b1f3adc77886 240 binary1[v]=x;
ajeet3004 0:b1f3adc77886 241 v++;
ajeet3004 0:b1f3adc77886 242 }
ajeet3004 0:b1f3adc77886 243 }
ajeet3004 0:b1f3adc77886 244
ajeet3004 0:b1f3adc77886 245 //Function to convertthe data from integer form to binary form which takes int c1 as parameter
ajeet3004 0:b1f3adc77886 246 void charBinary(int c1)
ajeet3004 0:b1f3adc77886 247 {
ajeet3004 0:b1f3adc77886 248 char x1 = ((c1 & 1)? '1' : '0');
ajeet3004 0:b1f3adc77886 249 // output.printf("%c",x1);
ajeet3004 0:b1f3adc77886 250 binary2[v1]=x1;
ajeet3004 0:b1f3adc77886 251 v1++;
ajeet3004 0:b1f3adc77886 252 }
ajeet3004 0:b1f3adc77886 253
ajeet3004 0:b1f3adc77886 254
ajeet3004 0:b1f3adc77886 255 /* ####### printChar function to convert the binary value into the respective character ########## */
ajeet3004 0:b1f3adc77886 256
ajeet3004 0:b1f3adc77886 257 void printChar(char x2[])
ajeet3004 0:b1f3adc77886 258 {
ajeet3004 0:b1f3adc77886 259
ajeet3004 0:b1f3adc77886 260 //memcpy(a, b, sizeof(a));
ajeet3004 0:b1f3adc77886 261 char *ON = x2 ;
ajeet3004 0:b1f3adc77886 262 output.printf("\n");
ajeet3004 0:b1f3adc77886 263 output.printf("%c",x2);
ajeet3004 0:b1f3adc77886 264 char subbuff[9];
ajeet3004 0:b1f3adc77886 265 for(int j=0; j<sizeof(result1); j++) {
ajeet3004 0:b1f3adc77886 266 result1[j]='\0';
ajeet3004 0:b1f3adc77886 267 }
ajeet3004 0:b1f3adc77886 268 unsigned char c3;
ajeet3004 0:b1f3adc77886 269 int k1;
ajeet3004 0:b1f3adc77886 270 int index = 0;
ajeet3004 0:b1f3adc77886 271 int fichero_len = (int)strlen(ON);
ajeet3004 0:b1f3adc77886 272
ajeet3004 0:b1f3adc77886 273 for(k1 = 0; k1 < fichero_len; k1 += 8) {
ajeet3004 0:b1f3adc77886 274 memcpy(subbuff, &ON[k1], 8); // <--- copy 8 butes only
ajeet3004 0:b1f3adc77886 275 subbuff[8] = '\0';
ajeet3004 0:b1f3adc77886 276 c3 = (unsigned char)strtol(subbuff, 0, 2);
ajeet3004 0:b1f3adc77886 277 //printf("\%s = %c = %d = 0x%.2X\n", subbuff, c3, c3, c3);
ajeet3004 0:b1f3adc77886 278 result1[index++] = c3;
ajeet3004 0:b1f3adc77886 279 result1[index] = '\0';
ajeet3004 0:b1f3adc77886 280 }
ajeet3004 0:b1f3adc77886 281 printf("\nResult = %s\n", result1);
ajeet3004 0:b1f3adc77886 282
ajeet3004 0:b1f3adc77886 283 }
ajeet3004 0:b1f3adc77886 284