找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 803|回复: 5
打印 上一主题 下一主题
收起左侧

pic单片机软件计算奇偶校验,出错

[复制链接]
跳转到指定楼层
楼主
ID:887685 发表于 2022-7-12 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 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);
复制代码
回复

使用道具 举报

板凳
ID:887685 发表于 2022-7-13 16:07 | 只看该作者
Hephaestus 发表于 2022-7-12 22:30
奇偶校验不用循环那么麻烦。

首先谢谢回复啊。
我感觉不是奇偶校验返回值的问题啊,因为我发了1,随后我又打印了1的校验位显示是0。发了2,又打印了2的校验位显示是0。发了3,打印了校验位显示是1。所以奇校验的返回值,我感觉是对的。
回复

使用道具 举报

地板
ID:887685 发表于 2022-7-13 16:11 | 只看该作者
fengxiaoliang 发表于 2022-7-13 16:07
首先谢谢回复啊。
我感觉不是奇偶校验返回值的问题啊,因为我发了1,随后我又打印了1的校验位显示是0。 ...

也就是这个奇校验函数,我入参是1,返回的是0。入参是2,返回值是0,入参是3。返回值是1。符合奇校验的校验位的规则啊。
回复

使用道具 举报

5#
ID:827243 发表于 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. }
复制代码
回复

使用道具 举报

6#
ID:887685 发表于 2022-7-13 18:45 | 只看该作者
daemondong 发表于 2022-7-13 16:55
从程序逻辑上看,算法麻烦了点,但是没错。只能看逻辑分析仪了,看看你收发的波形到底是什么? 算法简化代 ...

谢谢回复。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表