📄 crc_func.cpp
字号:
// printf("%x",data);
fprintf(fp,"%x-",data);
fprintf(fp,"%x",hehe);
fputc('\n',fp);
if(fclose(fp))
printf("can not close the file!\n");
StrToBinStr_tx5(hehe,s_tx5);//将crc5由16进制转换为2进制存在s字符串里
CString out;
for(i=0;i<5;i++){
str[i+11]=*(s_tx5+i+3);//将数据加上crc一共16位数据存入str字符串
}
p=bitstuff_tx5(result_tx5);//位填充
//puts(str);
syncf();//加同步位 写入文档
nrzif_tx5(p,result_tx5);//进行nrzi编码并加包尾 写入文档
synch();
nrzih_tx5(p,result_tx5);
s_tx5[0]='\0';
return 0;
}
/******************************** crc 16 rx high-speed************************************/
int readf_rx16_hs(int *a)
{
int i;
char c;
FILE *fp;
if((fp=fopen(RX_16_HS,"r"))==NULL)
{printf("can not open the file!\n");
}
do{
c=fgetc(fp);
}while(c!='\n');//从第二行开始读取数据
for(i=0;!feof(fp);i++)
{ fscanf(fp,"%d",&(*(a+i)));
}
if(fclose(fp))
{printf("can not close the file!\n");
}
return i;
}
void tox_rx16(char *str,int n,unsigned short *dat)
{
unsigned short ox=0;
int k,m,p;
int q=0;
//printf("%d",(n-16)/8);
// puts(str);
for(m=1;m<=(n-16)/8;m++)
{p=128;
for(k=8*m-1;k>=(m-1)*8;k--)
{
if(*(str+k)=='1')
ox+=p;
p/=2;
}
*(dat+q)=ox;
//printf("%x,",ox);
ox=0;
q++;
}
for(;m<=n/8;m++)
{p=128;
for(k=(m-1)*8;k<=m*8-1;k++)
{
if(*(str+k)=='1')
ox+=p;
p/=2;
}
*(dat+q)=ox;
ox=0;
q++;
}
}
/*
for(k=0;k<i;)
{
n=128;
for(j=0;j<8;j++)
{
if(*(str+k)=='1')
ox+=n;
n/=2;
k++;}
*(dat+q)=ox;
q++;
ox=0;
}
*/
void write(unsigned short* dat,int j)
{int i=0;
FILE *fp;
if((fp=fopen(DATA_RX16,"a"))==NULL)
{printf("can not open the file!\n");
}
for(;i<j;i++)
{
fprintf(fp,"%x",*(dat+i));
fputc('\0',fp);}
fputc('\n',fp);
if(fclose(fp))
{printf("can not close the file!\n");
}
}
char check( unsigned short *aData,unsigned long aSize)
{
unsigned short sign,a;
unsigned short temp;
int i,j;
char c;
a=0xffff;
//aData+=(aSize-1);
sign=0x01;
for(j=aSize-2;j>0;j--)
{printf("%x,",*aData);
for(i=0;i<8;i++)
{ temp=a&0x8000;
temp=temp>>15;
//printf("%x,",(*aData&sign)>>i);
if(((*aData&sign)>>i)^temp)
{
a=a<<1;
a=(a^crc_16);
// printf("%x,",a);
}
else
a=a<<1;
//printf("%x,",a);
sign=sign<<1;}
aData++;
sign=0x0001;
}
sign=0x80;
for(j=2;j>0;j--)
{//printf("%x,",*aData);
for(i=7;i>=0;i--)
{ temp=a&0x8000;
temp=temp>>15;
printf("%x,",(*aData&sign)>>i);
if(((*aData&sign)>>i)^temp)
{
a=a<<1;
a=(a^crc_16);
// printf("%x,",a);
}
else
a=a<<1;
//printf("%x,",a);
sign=sign>>1;}
aData++;
sign=0x80;
}
if(a==0x800d)
c='o';
else
c='k';
return c;
}
int buf_rx16[1000];
char s[512] = "";
char st[512] = "";
void crc16_rx_hs(void)
{ int m,n,i,j,p=0;
//int* buf = (int*)malloc(4000);
char c;
unsigned short dat[500];
n=readf_rx16_hs(buf_rx16);//返回数据位数
// printf("%d",n);
//for(m=0;m<n;m++)
// printf("%d,",a[m]);
if(buf_rx16[32]==10)
{s[0]='1';
p=0;}
if(buf_rx16[32]==1)
{s[0]='0';
p=1;}
for(m=33,i=1;m<n;m++,i++)//nrzi解码,最终i保存去除sync后的位数
{
if(buf_rx16[m]==10&&p==0)
{
s[i]='1';
p=0;}
else if(buf_rx16[m]==10&&p==1)
{
s[i]='0';
p=0;}
else if(buf_rx16[m]==1&&p==1)
{
s[i]='1';
p=1;}
else if(buf_rx16[m]==1&&p==0)
{
s[i]='0';
p=1;}
}
// printf("%d\n",i);
//puts(s);
m=1;//反位填充,初始位数为1,最终j保存去除eop和填充位后的bit数
for(p=0,j=0;p<(i-8);p++)
{
if(s[p]=='1')
{
m++;
st[j]='1';
if(m==6)
{
m=0;//此处可优化为位填充纠错
p++;
}
}
else if(s[p]=='0')
{
m=0;
st[j]='0';
}
j++;
}
//printf("%d",j);
//for(p=j-1;st[p]!='\0';p++)
//st[p]='\0';
// puts(st);
tox_rx16(st,j,dat);//转换为16进制
c=check(dat,j/8);
if(c=='o')
{
write(dat,j/8);
}//crc16正确,去除crc写入data.txt文档
else
AfxMessageBox("crc16 exists error!\n");
//free(buf);
}
/******************************** crc 16 rx full-speed************************************/
int readf_rx16_fs(int *a)
{
int i;
char c;
FILE *fp;
if((fp=fopen(RX_16_FS,"r"))==NULL)
{printf("can not open the file!\n");
}
do{
c=fgetc(fp);
}while(c!='\n');//从第二行开始读取数据
for(i=0;!feof(fp);i++)
{ fscanf(fp,"%d",&(*(a+i)));
}
if(fclose(fp))
{printf("can not close the file!\n");
}
return i;
}
void crc16_rx_fs(void)
{ int m,n,i,j,p=0;
//int a[500];
//char s[]="";
//char st[]="";
char c;
unsigned short dat[500];
n=readf_rx16_fs(buf_rx16);//返回数据位数
//for(m=0;m<n;m++)
// printf("%d,",a[m]);
if(buf_rx16[8]==10)
{s[0]='1';
p=0;}
if(buf_rx16[8]==1)
{s[0]='0';
p=1;}
for(m=9,i=1;m<n;m++,i++)//nrzi解码,最终i保存去除sync后的位数
{
if(buf_rx16[m]==10&&p==0)
{
s[i]='1';
p=0;}
else if(buf_rx16[m]==10&&p==1)
{
s[i]='0';
p=0;}
else if(buf_rx16[m]==1&&p==1)
{
s[i]='1';
p=1;}
else if(buf_rx16[m]==1&&p==0)
{
s[i]='0';
p=1;}
else if(buf_rx16[m]==0)
s[i]='3';
}
// printf("%d\n",i);
// puts(s);
m=1;//反位填充,初始位数为1,最终j保存去除eop和填充位后的bit数
for(p=0,j=0;p<(i-3);p++,j++)
{
if(s[p]=='1')
{
m++;
st[j]='1';
if(m==6)
{
m=0;
p++;
}
}
else if(s[p]=='0')
{
m=0;
st[j]='0';
}
}
for(p=j;st[p]!='\0';p++)//有问题
st[p]='\0';
// puts(st);
//printf("%d",j);
tox_rx16(st,j,dat);//转换为16进制
//for(i=0;i<j/8;i++)
//printf("%x,",dat[i]);
c=check(dat,j/8);
if(c=='o')
{
//printf("%d",j/8);
write(dat,j/8);
}//crc16正确,去除crc写入data.txt文档
else
AfxMessageBox("crc16 exists error!\n");
}
DWORD crc_func::crc16_rx(void)
{
if(transfer_info.speed == HIGH_SP)
{
crc16_rx_hs();
}
else if(transfer_info.speed == FULL_SP)
crc16_rx_fs();
return 0;
}
/******************************** crc 5 rx high-speed************************************/
int readf_rx5_hs(int *a)
{
int i;
char c;
FILE *fp;
if((fp=fopen(RX_5_HS,"r"))==NULL)
{printf("can not open the file!\n");
}
do{
c=fgetc(fp);
}while(c!='\n');//从第二行开始读取数据
for(i=0;!feof(fp);i++)
{ fscanf(fp,"%d",&(*(a+i)));
}
if(fclose(fp))
{printf("can not close the file!\n");
}
return i;
}
unsigned long tox_rx5(char *str_rx5,int i)
{
unsigned long ox=0;
int k,n=1;
if(*(str_rx5+i-1)=='1')
ox=1;
for(k=i-2;k>=0;k--)
{
if(*(str_rx5+k)=='1')
ox+=2*n;
n*=2;
}
return ox;
}
void write_rx5(unsigned long dat)
{
FILE *fp;
if((fp=fopen(DATA_RX5,"a"))==NULL)
{printf("can not open the file!\n");
}
fprintf(fp,"%x",dat);
fputc('\n',fp);
if(fclose(fp))
{
printf("can not close the file!\n");
}
}
char check_rx5(unsigned long dat,int j)
{
unsigned long sign;
unsigned char a;
unsigned short temp;
unsigned char crc_5=0x5;
int i;
a=0xff;
dat=dat<<5;
sign=0x100000;
for(i=j;i>0;i--)
{ temp=a&0x10;
//printf("%x,",temp);
//printf("%x,",dat&sign);
if((dat&sign)^(temp<<i))
{ a=a<<1;
a=(a^crc_5);
}
else
a=a<<1;
//printf("%x,",a);
sign=sign>>1;
}
a&=0x1f;
if(a==0xc)
return('o');
else
return('k');
}
int buf_rx5[500];
void crc5_rx_hs(void)
{ int m,n,i,j,p=0;
//int a[500];
//char s[]="";
//char st[]="";
char c;
unsigned long dat,data;
n=readf_rx5_hs(buf_rx5);//返回数据位数
//printf("%d",n);
//for(m=0;m<n;m++)
// printf("%d,",a[m]);
if(buf_rx5[32]==10)
{s[0]='1';
p=0;}
if(buf_rx5[32]==1)
{s[0]='0';
p=1;}
for(m=33,i=1;m<n;m++,i++)//nrzi解码,最终i保存去除sync后的位数
{
if(buf_rx5[m]==10&&p==0)
{
s[i]='1';
p=0;}
else if(buf_rx5[m]==10&&p==1)
{
s[i]='0';
p=0;}
else if(buf_rx5[m]==1&&p==1)
{
s[i]='1';
p=1;}
else if(buf_rx5[m]==1&&p==0)
{
s[i]='0';
p=1;}
}
m=1;//反位填充,初始位数为1,最终j保存去除eop和填充位后的bit数
for(p=0,j=0;p<(i-8);p++,j++)
{
if(s[p]=='1')
{
m++;
st[j]='1';
if(m==6)
{
m=0;
p++;
}
}
else if(s[p]=='0')
{
m=0;
st[j]='0';
}
}
//for(p=j;st[p]!='\0';p++)//有问题
//st[p]='\0';
dat=tox_rx5(st,j);
//转换为16进制
c=check_rx5(dat,j);
if(c=='o')
{
data=dat&0xffe0;
data=data<<3;
dat=dat&0x1f;
dat=dat^data;
dat=dat>>8 ;
write_rx5(dat);
}//crc16正确,去除crc写入data.txt文档
else
AfxMessageBox("crc5 exists error!\n");
}
/******************************** crc 5 rx full-speed************************************/
int readf_rx5_fs(int *a)
{
int i;
char c;
FILE *fp;
if((fp=fopen(RX_5_FS,"r"))==NULL)
{printf("can not open the file!\n");
}
do{
c=fgetc(fp);
}while(c!='\n');//从第二行开始读取数据
for(i=0;!feof(fp);i++)
{ fscanf(fp,"%d",&(*(a+i)));
}
if(fclose(fp))
{printf("can not close the file!\n");
}
return i;
}
int buf_rx5_fs[500];
char s_rx5_fs[512] = "";
char st_rx5_fs[512] = "";
void crc5_rx_fs(void)
{ int m,n,i,j,p=0;
//int a[500];
//char s[]="";
///char st[]="";
char c;
unsigned long dat,data;
n=readf_rx5_fs(buf_rx5_fs);//返回数据位数
if(buf_rx5_fs[8]==10)
{s_rx5_fs[0]='1';
p=0;}
if(buf_rx5_fs[8]==1)
{s_rx5_fs[0]='0';
p=1;}
for(m=9,i=1;m<n;m++,i++)//nrzi解码,最终i保存去除sync后的位数
{
if(buf_rx5_fs[m]==10&&p==0)
{
s_rx5_fs[i]='1';
p=0;}
else if(buf_rx5_fs[m]==10&&p==1)
{
s_rx5_fs[i]='0';
p=0;}
else if(buf_rx5_fs[m]==1&&p==1)
{
s_rx5_fs[i]='1';
p=1;}
else if(buf_rx5_fs[m]==1&&p==0)
{
s_rx5_fs[i]='0';
p=1;}
else if(buf_rx5_fs[m]==0)
s_rx5_fs[i]='3';
}
m=1;//反位填充,初始位数为1,最终j保存去除eop和填充位后的bit数
for(p=0,j=0;p<(i-3);p++,j++)
{
if(s_rx5_fs[p]=='1')
{
m++;
st_rx5_fs[j]='1';
if(m==6)
{
m=0;
p++;
}
}
else if(s_rx5_fs[p]=='0')
{
m=0;
st_rx5_fs[j]='0';
}
}
for(p=j;st_rx5_fs[p]!='\0';p++)//有问题
st_rx5_fs[p]='\0';
dat=tox_rx5(st_rx5_fs,j);
//转换为16进制
//printf("%x",dat);
c=check_rx5(dat,j);
if(c=='o')
{
data=dat&0xffe0;
data=data<<3;
dat=dat&0x1f;
dat=dat^data;
dat=dat>>8 ;
write_rx5(dat);
}//crc16正确,去除crc写入data.txt文档
else
AfxMessageBox("crc5 exists error!\n");
}
DWORD crc_func::crc5_rx(void)
{
if(transfer_info.speed == HIGH_SP)
crc5_rx_hs();
else if(transfer_info.speed == FULL_SP)
{
crc5_rx_fs();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -