OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2671|回复: 2

求wiegand26的收发程序

[复制链接]

9

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2016-7-4
在线时间
47 小时
发表于 2016-11-10 09:35:45 | 显示全部楼层 |阅读模式
5金钱
求wiegand26的收发程序,感谢!!!!

最佳答案

查看完整内容[请看2#楼]

自己找到的,分享一下: void Send_WieGand26(unsigned char *str) { unsigned char i = 0x00; unsigned char check_temp = 0x00; //韦根包奇偶效验中间暂存 char even = 0x00; //韦根包前12位偶效验 char odd = 0x00; //韦根包后12位奇效验 static unsigned char wiegand[3] = {0x00,0x00,0x00}; //韦根包数据24位 WieGand26_Send_Set_StartEnd_Flag(true);//设置韦根数据发送开始标志 //数组到韦根包的转化 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2016-7-4
在线时间
47 小时
 楼主| 发表于 2016-11-10 09:35:46 | 显示全部楼层
自己找到的,分享一下:
void Send_WieGand26(unsigned char *str)
{
        unsigned char i = 0x00;
        unsigned char check_temp = 0x00; //韦根包奇偶效验中间暂存
        char even = 0x00; //韦根包前12位偶效验
        char odd = 0x00; //韦根包后12位奇效验
        static unsigned char wiegand[3] = {0x00,0x00,0x00}; //韦根包数据24位

        WieGand26_Send_Set_StartEnd_Flag(true);//设置韦根数据发送开始标志
        //数组到韦根包的转化
        wiegand[0] = wiegand[0] | ((*str) << 4); //原理是把每个字节的低4位取出,来计算这个字节的值
        wiegand[0] = wiegand[0] | (*(str + 1) & 0x0f);//计算前8位1的个数,为偶效验用
    wiegand[0] = wiegand[0] | ((*str) << 4);//原理是把每个字节的低4位取出,来计算这个字节的值
    wiegand[0] = wiegand[0] | (*(str + 1) & 0x0f);
    wiegand[1] = wiegand[1] | (*(str + 2) << 4);
    wiegand[1] = wiegand[1] | (*(str + 3) & 0x0f);
        wiegand[2] = wiegand[2] | (*(str + 4) << 4);
    wiegand[2] = wiegand[2] | (*(str + 5) & 0x0f);
       
    check_temp = wiegand[1] & 0xf0;
    check_temp ^= wiegand[0];
    check_temp ^= check_temp >> 4;
    check_temp ^= check_temp >> 2;
    check_temp ^= check_temp >> 1;
    even = !(check_temp & 1); //计算前12位1的个数是否为偶数,为偶效验用
   
    check_temp = wiegand[1] & 0x0f;
    check_temp ^= wiegand[2];
    check_temp ^= check_temp >> 4;
    check_temp ^= check_temp >> 2;
    check_temp ^= check_temp >> 1;
    odd = check_temp & 1; //计算后12位1的个数是否为偶数,为奇效验用
        //启动发送,用定时器做时间延时
        //韦根 输出端初始化
        WIEGAND_DATA0_UP();
        WIEGAND_DATA1_UP();
        //发送偶效验
        if(even)
        {
                WIEGAND_DATA1_DOWN();
                Delay_us(100);//延时100us
                WIEGAND_DATA1_UP();
        }
        else
        {
                WIEGAND_DATA0_DOWN();
                Delay_us(100);//延时100us
                WIEGAND_DATA0_UP();
        }
        Delay_us(1500);//延时一个发送周期1500us
        //发送24位数据
        for(i = 0; i < 24; i++)
        {
                //韦根 输出端初始化
                WIEGAND_DATA0_UP();
                WIEGAND_DATA1_UP();
                if((wiegand[0]) & 0x80)
                {
                        WIEGAND_DATA1_DOWN();
                        Delay_us(100);//延时100us
                        WIEGAND_DATA1_UP();
                }
                else
                {
                        WIEGAND_DATA0_DOWN();
                        Delay_us(100);//延时100us
                        WIEGAND_DATA0_UP();
                }
                (*(long*)&wiegand[0]) <<= 1;
                Delay_us(1500);//延时一个发送周期1500us
        }
        //发送奇效验位
        //韦根 输出端初始化
        WIEGAND_DATA0_UP();
        WIEGAND_DATA1_UP();
        if(odd)
        {
                WIEGAND_DATA1_DOWN();
                Delay_us(100);//延时100us
                WIEGAND_DATA1_UP();
        }
        else
        {
                WIEGAND_DATA0_DOWN();
                Delay_us(100);//延时100us
                WIEGAND_DATA0_UP();
        }
        WieGand26_Send_Set_StartEnd_Flag(false);//设置韦根数据发送结束标志
}

void Recive_WeiGand26(unsigned char *str)
{
    unsigned char k;
        unsigned char Even; // 偶检验位
        unsigned char Odd; // 奇检验位
        unsigned char CheakEven = 0; //偶检验
        unsigned char CheakOdd = 1; //奇检验
               
        unsigned char WGstr[3] = {0x00, 0x00, 0x00}; //存韦根ID卡卡号的HID和PID码,其中HID码为8位即一字节,PID码16位两字节
    for(k = 0; k < 26; k++)
        {
        if(k <= 0) //读偶检验位
                {
            if(str[k] == 0)
                Even = 0;
            else
                Even = 1;
        }
        if(k >= 25) //读奇检验位
                {
            if(str[k] == 0)
                Odd = 0;
            else
                Odd = 1;
        }
        if(k <= 8) //读HID码低8位
                {
            if(str[k] == 0x00)
                WGstr[0] |= 0x00;
            else
                        {
                WGstr[0] |= 0x01;
                CheakEven = ~ CheakEven; // 根据HID码低8位1的个数来确定偶检验位是1还是0
            }
            if(k < 8)
                WGstr[0] = WGstr[0] << 1;
        }
        if(k <= 16) //读PID码高8位
                {
            if(str[k] == 0x00)
                WGstr[1] |= 0x00;
            else
                        {
                WGstr[1] |= 0x01;
                CheakOdd = ~CheakOdd; //// 根据PID码高8位1的个数来确定奇检验位是1还是0
            }
            if(k < 16)
                WGstr[1] = WGstr[1] << 1;
        }
                else //读PID码的低8位
                {
            if(str[k] == 0x00)
                WGstr[2] |= 0x00;
            else
                        {
                                WGstr[2] |= 0x01;
                CheakOdd = ~CheakOdd; // 根据PID码低8位1的个数来确定奇检验位是1还是0
            }
            if(k < 24)
                WGstr[2] = WGstr[2] << 1;
        }
    }
        if((Even == CheakEven) && (Odd == CheakOdd))
                return;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-11-10 23:15:48 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 08:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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