android串口通讯奇偶校验,串口通讯奇偶数校验及CRC校验如何使用详解
我們以前在學校使用串口基本都不用奇偶數校驗都是采用硬件CRC(循環冗余校驗碼)校驗的。但有時候為了數據傳輸的更加嚴謹和差錯的處理會采用奇偶校驗。這里簡單說下軟件上CRC校驗是如何計算的。
所謂CRC是指將數據以二進制的多項式形式來說明,也就是將二進制數轉換成多項式的形式,多項式和二進制有直接的對應關系。x的最高次冪數對應二進制的最高位,那么對應的多項式的各次冪為:有此冪次項對應為1,無此冪次項對應0,且x的最高冪次為R,那么轉出成對應的二進制數有R+1位;
例如報文:11001對應的信息多項式為:c(x)=
x^4+x^3+1;又如對應的信息多項式為c(x)=x^5+x^3+x+1;那么對應的報文數據為:101011;
多項式包括生成多項式G(X)和信息多項式C(x)(也就是要發送報文的二進制數據生成的多項式);
多項式是是發送方和接收方的一個約定,也是一個二進制數,在整個數據傳輸過程,這個數不會變,雙方以這個數為標準,對發送的數據做一個“模2除法”,以此來驗證數據的收發是否正確。且CRC校驗碼的位數=R-1(即是最高次冪位數減1);那么怎么計算出一個報文的CRC校驗碼呢?
假設生成多項式為:g(x)=x^4+x^3+x+1;求出對應要送二進制數據10101的CRC校驗碼;
1 先把生成多項式g(x)=x^4+x^3+x+1轉換成二進制數除數即:11011;
2
從上面知道,CRC校驗碼為R-1=3,所以要發送的CRC校驗碼為3位數,那么將報文10101左移動3位即10101
000;后面3位就是后面要替換對應的CRC校驗碼的數。
3用生成多項式的二進制數對要發送的報文(10101
000)做“模2除法”運算,得到3位數的余數,就是對應的CRC校驗碼,將得到的余數替換報文后三位000即可。
說完CRC校驗,下面說一下串口的奇偶數校驗,基于51單片機來講。
所謂的奇偶數校驗就是串口數據傳輸提供的一種對收發數據是否正確的一種校驗方式。是指將對應的要發送的數據以二進制的形式,計算其數據里面“1”的個數,例如數據:101101里面“1”的個數為4個,則為偶數個;又如數據:10101里面的“1”的個數為3個,則為奇數個。如,采用偶校驗,那么101101對應的偶數校驗碼為0,10101對應的偶數校驗碼為1;滿足發送的數據二進制的“1”的個數機上偶數校驗碼等于偶數的條件即可。
在51單片機中,一般不使用奇偶校驗時,我們發送的數據是8位,使用奇偶校驗時,在發送完數據后,還要再發送一位校驗位即一共9位數據。而1單片機提供了TB8和RB8兩個寄存器。在平時不使用奇偶數校驗時,這兩個寄存器沒什么作用,TB8就是發送方要發送的奇偶數校驗碼寄存器,而RB8就是接收方接收到的奇偶數校驗碼狀態寄存器。每次在發送數據前,要先計算出該數據對應的奇偶數校驗碼,并將該校驗碼賦值給TB8寄存器。接收將數據發送給發送寄存器buf,發送完數據,接著再發送一位校驗碼數據;而接收方通過RB8狀態寄存器內的狀態碼來判斷所接收數據是否符合奇偶數,從而判斷數據傳輸有沒有出錯。
那么,如何計算得出奇偶校驗碼呢?下面寫出兩種樓主用的方法:
1:
u8 xdata parity=0; ?//初始判斷標記
u8 xdata
parity_data=0;//對應是否為奇偶數
parity_data=c;// ?c為要發送的數據
while (parity_data)
{
parity = !parity; //奇數為1,偶數為0
parity_data = parity_data & (parity_data
- 1);
}
if(0==parity) //偶數
{
TB8=0;
}else ?// ?奇數
{
TB8=1;
}
這里是通過parity定義初始變量為0 ,然后parity_data -
1來減少“1”的個數,再與上parity_data;每次減少一個“1”,對應parity就取反,直到最后一個“1”時,可得出對應的parity變量為“1”還是“0”,即可得出該數據是偶數還是奇數g
個“1”;然后再對TB8寄存器進行賦值;
2
ACC=c; ?// ?ACC累加器
if(P==1)// ?奇數
{
TB8=1;
}
else
{
TB8=0;
}
第二種方法更加簡單,直接利用ACC累加器來計算數據的奇偶校驗碼;
將數據直接賦值給ACC累加器,他會對數據進行一個累加。然后累加器中“P”位的數據會隨ACC累加器中數值的變化而變化,如果ACC的數據有奇數個“1”則對應的"P"位置1,否則置0.那么就可以通過"P"來判斷數據里面“1”的個數,從而對奇偶校驗碼寄存器賦值。
總結
以上是生活随笔為你收集整理的android串口通讯奇偶校验,串口通讯奇偶数校验及CRC校验如何使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android读取网页标题,如何获取We
- 下一篇: android服务的说法错误的是,下面关