⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc_func.cpp

📁 该工具用于数字电路仿真中的usb数据文件转换: 1.可以把11比特的令牌包数据(crc5)或者任意字节的数据包数据(crc16)转换为可以作为仿真输入的dn dp文件。 2.可以根据仿真接收到的d
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//	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 + -