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

📄 network_b.cpp

📁 模拟网络传输
💻 CPP
字号:
//循环冗余码及模拟噪声干扰

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"

#define LEN 4	//每帧数据长

char Data[50];			//待传输数据
char send[LEN+2];		//加上2字节CRC码的待传输数据
char received[LEN+2];	//收到的数据
//------------------------------------------------------

short do_crc(char *message, int length)	//CRC16-CCITT标准
{
	int i, j;
	short crc_reg = 0;
	short current;
	
	for (i = 0; i < length; i++) 
    {
		current = message[i] << 8;
		for (j = 0; j < 8; j++)
		{
			if ((short)(crc_reg ^ current) < 0)
				crc_reg = (crc_reg >> 1) ^ 0x1021;	//0x1021为CRC16-CCITT的生成多项式简记
			else
				crc_reg <<= 1;
			current <<= 1;
		}
	}
	return crc_reg;
} 

//------------------------------------------------------

void printb(char data)		//以二进制输出一个字节的内容
{
	char B;
	for(int i = 7; i > -1; i--)
	{
		B = data;
		B = B >> i;
		B = B & 1;

		printf("%d",B);
	}
}

//------------------------------------------------------

char Noiser()		//噪声发生器,产生一字节的随机二进制串
{
	int i;
	long p;
	char data1 = 0;

	for (i = 0; i <= 7; i++)
	{
		p = rand();
		if (p < 500) 
		{
			data1 = data1<<1;
			data1 = data1 | 1;
		}//p是随机数,如果小于500则将对应位置1,反之置0(只向左移1位)
		else
			data1 = data1<<1;
	}
	return(data1);
}

//------------------------------------------------------

void main()
{
	unsigned int i = 0 ,j;
	char *message;
	char *message1;

	srand(time(NULL));	//以当前时间为随机数发生器种子

	printf("请输入需要传输的数据:");//获取待传输数据
	scanf("%s",Data);
	getchar();

	printf("\n数据总长%d个字符,每帧含有数据%d字节,校验码2字节\n",strlen(Data),LEN);

	for (i = 0; i < strlen(Data); i++)
	{
		message = &Data[i];
		printf("\n");
		printf("第%d帧\t ", (i/LEN) + 1);

		while ((i + 1)%LEN != 0)
		{
			send[i%LEN] = Data[i];//-----数据赋给send数组
			i++;
		}
		send[i%LEN] = Data[i];//-----数据赋给send数组

		send[LEN]=(do_crc(message,LEN) >> 8) & 0x00FF;//-----校验码赋给send数组
		send[LEN+1]=do_crc(message,LEN) & 0x00FF;//-----校验码赋给send数组

		for(j = 0; j < LEN+2; j++)	//输出原数据
			printb(send[j]);
//--------------------------------------------
		printf("\n");
	p:	for(j = 0; j < LEN + 2; j++)
			received[j]=send[j] ^ Noiser();	//干扰ing……

		message1 = &received[0];

		printf("收到数据:");
		for(j = 0; j < LEN+2; j++)	//输出收到的数据
			printb(received[j]);

		if (do_crc(message1,LEN+2) == 0)	//收到后校验,等于0即未被干扰
			printf("\t发送成功!\n");
		else
		{
			printf("\t发送失败!重试…\n");
			goto p;		//若干扰,转到重发
		}
	}
	getchar();
}
//------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -