// RX skalgo'2016--2017 // Manchester coding // 21.11.2017 - dodano CRC32 #define CRC8 255 #define CRC16 254 #define CRC32 253 byte crct=CRC8; #define fmpin 3 #define ledpin 5 // ant. pokojowa // #define ledpin 13 // #define N 1000 char str[128]=""; int stri=0; void setup() { Serial.begin(9600); pinMode(fmpin,INPUT_PULLUP); // pinMode(fmpin,INPUT); pinMode(ledpin,OUTPUT); } int get_tx_pin() { return(digitalRead(fmpin)); } int get_pin() { return(get_tx_pin()); } const unsigned char bit[]={1,2,4,8,16,32,64,128}; int getbit(char c,int i) { return((c&bit[i])==bit[i]); } void setbit(char *c,int i) { *c|=bit[i]; } char read_char() { char c=0; int i; unsigned long int s,l; do // START { while(!get_pin()) digitalWrite(ledpin,LOW); s=micros(); while(get_pin()) digitalWrite(ledpin,HIGH); l=micros()-s; }while(l<2*N); digitalWrite(ledpin,LOW); // spacja s=micros(); while(micros()-s<100); for(i=0;i<8;i++) { float a1,a2,n; a1=0; n=0; s=micros(); do { a1+=get_pin(); n++; }while(micros()-s>=1; if(sum) crc8^=0x8C; b>>=1; } } return(crc8); } // CRC 16 bit CCITT // http://stackoverflow.com/questions/10564491/function-to-calculate-a-crc16-checksum unsigned short int calc_crc16(unsigned char *data,int len) { unsigned short int crc16=0xFFFF; unsigned char x; int i; for(i=0;i>8^str[i]; x^=x>>4; crc16=(crc16<<8)^((unsigned short)(x<<12))^((unsigned short)(x<<5))^((unsigned short)x); } return(crc16); } // CRC 32 // http://www.cl.cam.ac.uk/research/srg/bluebook/21/crc/node6.html // Algorithm One unsigned long int calc_crc32(unsigned char *data,int len) { #define QUOTIENT 0x04c11db7 unsigned long int result; int i,j; unsigned char octet; result=-1; for(i=0;i>7)^(result>>31)) result=(result<<1)^QUOTIENT; else result=(result<<1); octet<<=1; } } return(~result); } void loop() { char c=read_char(); digitalWrite(ledpin,HIGH); if(stri<127) { str[stri]=c; stri++; str[stri]=0; } if((unsigned char)c==CRC8) { crct=CRC8; stri=0; str[0]=0; } else if((unsigned char)c==CRC16) { crct=CRC16; stri=0; str[0]=0; } else if((unsigned char)c==CRC32) { crct=CRC32; stri=0; str[0]=0; } else if(c=='\n') { if(crct==CRC8) { char crc8; char crc1=read_char(); char crc2=read_char(); crc8=calc_crc8(str,strlen(str)); if((unsigned char)crc1==(unsigned char)crc8&&(unsigned char)crc2==(unsigned char)crc8) Serial.print(str); } else if(crct==CRC16) { unsigned short int crc16; char crc1=read_char(); char crc2=read_char(); char crc3=read_char(); char crc4=read_char(); crc16=calc_crc16(str,strlen(str)); char *p1=(char*)&crc16; char *p2=(char*)&crc16; p2++; if((crc1==crc3)&&(crc2==crc4)) if((unsigned char)crc1==(unsigned char)*p1&&(unsigned char)crc2==(unsigned char)*p2) Serial.print(str); } else if(crct==CRC32) { unsigned long int crc32=-1; // 4 bajty char crc1=read_char(); char crc2=read_char(); char crc3=read_char(); char crc4=read_char(); crc32=calc_crc32(str,strlen(str)); char *p1=(char*)&crc32; char *p2=(char*)&crc32; char *p3=(char*)&crc32; char *p4=(char*)&crc32; p2+=1; p3+=2; p4+=3; if((unsigned char)crc1==(unsigned char)*p1&&(unsigned char)crc2==(unsigned char)*p2&& (unsigned char)crc3==(unsigned char)*p3&&(unsigned char)crc4==(unsigned char)*p4) Serial.print(str); } } }