欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: pic單片機軟件計算奇偶校驗,出錯 [打印本頁]

作者: fengxiaoliang    時間: 2022-7-12 10:34
標題: pic單片機軟件計算奇偶校驗,出錯
pic軟件計算奇偶校驗,發送1,2,3,4,5。顯示3F,3F,03,3F,05。請大家幫忙看看
uint add (uint data)        //奇校驗 1的個數為奇數
{
        uint i = 0;
        int cnt = 0;
        int temp = 0;
        for(i = 0;i < 8;i++)
        {
                temp = ((data >> i) & 1);
                cnt += temp;
        }
        if(cnt%2 == 0)
        {
                return 1;
        }
        else
        {
                return 0;
        }


}





void Usart_Init (void)               
{        
        RCSTA = 0xD0;                //9位接收               
        TXSTAbits.TX9 = 1;  //9位發送
        TXSTAbits.TXEN = 1;        //使能發送
        TXSTAbits.SYNC = 0;        //異步
        TXSTAbits.BRGH = 1;        //高速

        BAUDCONbits.BRG16 = 0; //SYNC = 0, BRGH = 1, BRG16 = 0
                                       
        SP1BRGH = 0;
        SP1BRGL = 0x19;                        //25,波特率9600
        RCIE = 1;
        RCIF = 0;
//        TXIE = 1;
}


void Usart_SEND (uint TX)
{        
        TXSTAbits.TX9D = add(TX);
        TXREG = TX;
        while(!TXSTAbits.TRMT);
        delayus(50);
}




作者: Hephaestus    時間: 2022-7-12 22:30
本帖最后由 Hephaestus 于 2022-7-12 22:37 編輯

奇偶校驗不用循環那么麻煩。
  1.                 k=c^(c>>1);
  2.                 k=k^(k>>2);
  3.                 k=k^(k>>4);
  4.                 return(k&1);
復制代碼

作者: fengxiaoliang    時間: 2022-7-13 16:07
Hephaestus 發表于 2022-7-12 22:30
奇偶校驗不用循環那么麻煩。

首先謝謝回復啊。
我感覺不是奇偶校驗返回值的問題啊,因為我發了1,隨后我又打印了1的校驗位顯示是0。發了2,又打印了2的校驗位顯示是0。發了3,打印了校驗位顯示是1。所以奇校驗的返回值,我感覺是對的。
作者: fengxiaoliang    時間: 2022-7-13 16:11
fengxiaoliang 發表于 2022-7-13 16:07
首先謝謝回復啊。
我感覺不是奇偶校驗返回值的問題啊,因為我發了1,隨后我又打印了1的校驗位顯示是0。 ...

也就是這個奇校驗函數,我入參是1,返回的是0。入參是2,返回值是0,入參是3。返回值是1。符合奇校驗的校驗位的規則啊。
作者: daemondong    時間: 2022-7-13 16:55
從程序邏輯上看,算法麻煩了點,但是沒錯。只能看邏輯分析儀了,看看你收發的波形到底是什么? 算法簡化代碼如下:
  1. uint add (uint data)        //奇校驗 1的個數為奇數
  2. {
  3.         uint i = 0;
  4.         int cnt = 1;
  5.         for(i = 0;i < 8;i++)
  6.             if ((data >> i) & 1) cnt =1-cnt;

  7.         return cnt;

  8. }
復制代碼

作者: fengxiaoliang    時間: 2022-7-13 18:45
daemondong 發表于 2022-7-13 16:55
從程序邏輯上看,算法麻煩了點,但是沒錯。只能看邏輯分析儀了,看看你收發的波形到底是什么? 算法簡化代 ...

謝謝回復。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1