奇偶校驗需要一位校驗位,即使用串口通信的方式2或方式3(8位數據位+1位校驗位)。
奇校驗(odd parity):讓傳輸的數據(包含校驗位)中1的個數為奇數。
即:如果傳輸字節中1的個數是偶數,則校驗位為“1”,奇數相反。
以發送字符:10101010為例
偶校驗(even parity):讓傳輸的數據(包含校驗位)中1的個數為偶數。
即:如果傳輸字節中1的個數是偶數,則校驗位為“0”,奇數相反。
還是以發送字符:10101010為例
數據和校驗位發送給接受方后,接收方再次對數據中1的個數進行計算,如果為奇數則校驗通過,表示此次傳輸過程未發生錯誤。如果不是奇數,則表示有錯誤發生,此時接收方可以向發送方發送請求,要求重新發送一遍數據。
優缺點:
- 奇偶校驗的檢錯率只有50%,因為只有奇數個數據位發生變化能檢測到,如果偶數個數據位發生變化則無能為力了╮(╯﹏╰)╭
- 奇偶校驗每傳輸一個字節都需要加一位校驗位,對傳輸效率影響很大。
- 奇偶校驗只能發現錯誤,但不能糾正錯誤,也就是說它只能告訴你出錯了,但不能告訴你怎么出錯了,一旦發現錯誤,只好重發。
- 雖然奇偶校驗有很多缺點,但因為其使用起來十分簡單,故目前仍被廣泛使用。
應用:
如何用編程確定一個字節中“1”個數的奇偶性?我們可以利用二進制數相加的特點:
0+0=0、1+0=1、1+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;
}
審核編輯:符乾江
-
嵌入式C
+關注
關注
0文章
6瀏覽量
6743 -
奇偶校驗
+關注
關注
0文章
15瀏覽量
8232
發布評論請先 登錄
相關推薦
評論