中级会员
 
- 积分
- 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;
}
|
|