奇偶校驗(yàn)需要一位校驗(yàn)位,即使用串口通信的方式2或方式3(8位數(shù)據(jù)位+1位校驗(yàn)位)。
奇校驗(yàn)(odd parity):讓傳輸?shù)臄?shù)據(jù)(包含校驗(yàn)位)中1的個(gè)數(shù)為奇數(shù)。
即:如果傳輸字節(jié)中1的個(gè)數(shù)是偶數(shù),則校驗(yàn)位為“1”,奇數(shù)相反。
以發(fā)送字符:10101010為例

偶校驗(yàn)(even parity):讓傳輸?shù)臄?shù)據(jù)(包含校驗(yàn)位)中1的個(gè)數(shù)為偶數(shù)。
即:如果傳輸字節(jié)中1的個(gè)數(shù)是偶數(shù),則校驗(yàn)位為“0”,奇數(shù)相反。
還是以發(fā)送字符:10101010為例

數(shù)據(jù)和校驗(yàn)位發(fā)送給接受方后,接收方再次對(duì)數(shù)據(jù)中1的個(gè)數(shù)進(jìn)行計(jì)算,如果為奇數(shù)則校驗(yàn)通過,表示此次傳輸過程未發(fā)生錯(cuò)誤。如果不是奇數(shù),則表示有錯(cuò)誤發(fā)生,此時(shí)接收方可以向發(fā)送方發(fā)送請(qǐng)求,要求重新發(fā)送一遍數(shù)據(jù)。
優(yōu)缺點(diǎn):
- 奇偶校驗(yàn)的檢錯(cuò)率只有50%,因?yàn)橹挥衅鏀?shù)個(gè)數(shù)據(jù)位發(fā)生變化能檢測(cè)到,如果偶數(shù)個(gè)數(shù)據(jù)位發(fā)生變化則無能為力了╮(╯﹏╰)╭
- 奇偶校驗(yàn)每傳輸一個(gè)字節(jié)都需要加一位校驗(yàn)位,對(duì)傳輸效率影響很大。
- 奇偶校驗(yàn)只能發(fā)現(xiàn)錯(cuò)誤,但不能糾正錯(cuò)誤,也就是說它只能告訴你出錯(cuò)了,但不能告訴你怎么出錯(cuò)了,一旦發(fā)現(xiàn)錯(cuò)誤,只好重發(fā)。
- 雖然奇偶校驗(yàn)有很多缺點(diǎn),但因?yàn)槠涫褂闷饋硎趾?jiǎn)單,故目前仍被廣泛使用。
應(yīng)用:
如何用編程確定一個(gè)字節(jié)中“1”個(gè)數(shù)的奇偶性?我們可以利用二進(jìn)制數(shù)相加的特點(diǎn):
0+0=0、1+0=1、1+1=0
可以看出,如果我們將一個(gè)字節(jié)的所有位相加
- 有奇數(shù)個(gè)“1”的字節(jié)的和為1
- 有偶數(shù)個(gè)“1”的字節(jié)的和為0
由此即可通過編程完成判斷。實(shí)際應(yīng)用中,實(shí)現(xiàn)方法很多,但這是相對(duì)簡(jiǎn)單的一種,這里不再贅述。
代碼實(shí)現(xiàn)部分如下:
#include
#include
unsigned char add(char data)//奇校驗(yàn)
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一個(gè)char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i個(gè)位置得到的值,((data >> i) & 1)是與1不同的個(gè)數(shù)
cnt += temp;//cnt記錄二進(jìn)制下data中1的個(gè)數(shù)
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//當(dāng)cnt能夠被2整除,即cnt是偶數(shù),即1的個(gè)數(shù)是偶數(shù)
{
ans += 1;//在最右邊加1
}
else//當(dāng)cnt不能夠被2整除,即cnt是奇數(shù),即1的個(gè)數(shù)是奇數(shù)
{
ans += 0;//在最右邊加0
}
return ans;
}
unsigned char add_2(char data)//偶校驗(yàn)
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一個(gè)char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i個(gè)位置得到的值,((data >> i) & 1)是與1不同的個(gè)數(shù)
cnt += temp;//cnt記錄二進(jìn)制下data中1的個(gè)數(shù)
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//當(dāng)cnt能夠被2整除,即cnt是偶數(shù),即1的個(gè)數(shù)是偶數(shù)
{
ans += 0;//在最右邊加0
}
else//當(dāng)cnt不能夠被2整除,即cnt是奇數(shù),即1的個(gè)數(shù)是奇數(shù)
{
ans += 1;//在最右邊加1
}
return ans;
}
int main()
{
char a;
unsigned char b;
scanf("%c", &a);
b = add(a);
printf("2進(jìn)制結(jié)果表示為:");//輸出b的2進(jìn)制表示
for (int i = 7; i >= 0; i--) {
if (((b>>i) & 1) == 1)
printf("1");
else
printf("0");
} putchar(10);
return 0;
}
審核編輯:符乾江
-
嵌入式C
+關(guān)注
關(guān)注
0文章
6瀏覽量
6864 -
奇偶校驗(yàn)
+關(guān)注
關(guān)注
0文章
15瀏覽量
8290
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
請(qǐng)問DAC3484的LVDS數(shù)字接口如何區(qū)分4個(gè)信道?
RAID 5 磁盤陣列的組成
RAID 5 技術(shù)優(yōu)勢(shì)與應(yīng)用
dac161p997這幾個(gè)寄存器全配置為0,當(dāng)發(fā)生錯(cuò)誤時(shí),dac161p997會(huì)不會(huì)依據(jù)錯(cuò)誤的數(shù)據(jù)進(jìn)行輸出?
raid 硬盤陣列優(yōu)缺點(diǎn)
如何通過I2C加載TPS2388x SRAM和奇偶校驗(yàn)代碼

Traveo T2G SRAM不是32位的嗎?如何得到一個(gè)64位的?
8位到9位奇偶校驗(yàn)總線收發(fā)器ABT8338數(shù)據(jù)表

帶奇偶校驗(yàn)發(fā)生器/校驗(yàn)器和3態(tài)輸出的16位收發(fā)器ABT16657數(shù)據(jù)表

8位到9位奇偶校驗(yàn)總線收發(fā)器SN74BCT29854數(shù)據(jù)表

帶奇偶校驗(yàn)發(fā)生器/校驗(yàn)器和3態(tài)輸出的八進(jìn)制收發(fā)器SN74F657數(shù)據(jù)表

帶奇偶校驗(yàn)器和雙3態(tài)輸出的3.3-V 12位通用總線驅(qū)動(dòng)器SN74ALVCH16903數(shù)據(jù)表

雙8位至9位奇偶校驗(yàn)總線收發(fā)器ABT16833數(shù)據(jù)表

做lora通訊用到usart,配置時(shí)遇到的usart奇偶校驗(yàn)問題求解
8位到9位奇偶校驗(yàn)總線收發(fā)器數(shù)據(jù)表

評(píng)論