📄 network_b.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 + -