奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。
奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。
即:如果传输字节中1的个数是偶数,则校验位为“1”,奇数相反。
以发送字符:10101010为例
偶校验(even parity):让传输的数据(包含校验位)中1的个数为偶数。
即:如果传输字节中1的个数是偶数,则校验位为“0”,奇数相反。
还是以发送字符:10101010为例
数据和校验位发送给接受方后,接收方再次对数据中1的个数进行计算,如果为奇数则校验通过,表示此次传输过程未发生错误。如果不是奇数,则表示有错误发生,此时接收方可以向发送方发送请求,要求重新发送一遍数据。
优缺点:
应用:
如何用编程确定一个字节中“1”个数的奇偶性?我们可以利用二进制数相加的特点:
0+0=0、1+0=1、1+1=0
可以看出,如果我们将一个字节的所有位相加
由此即可通过编程完成判断。实际应用中,实现方法很多,但这是相对简单的一种,这里不再赘述。
代码实现部分如下:
#include
#include
unsigned char add(char data)//奇校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一个char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 1;//在最右边加1
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 0;//在最右边加0
}
return ans;
}
unsigned char add_2(char data)//偶校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一个char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 0;//在最右边加0
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 1;//在最右边加1
}
return ans;
}
int main()
{
char a;
unsigned char b;
scanf("%c", &a);
b = add(a);
printf("2进制结果表示为:");//输出b的2进制表示
for (int i = 7; i >= 0; i--) {
if (((b>>i) & 1) == 1)
printf("1");
else
printf("0");
} putchar(10);
return 0;
}
审核编辑:符乾江
全部0条评论
快来发表一下你的评论吧 !