2017-05-08 19 views
0

키패드가있는 Hikvision 카드 리더 라이브러리를 작성하려고합니다. Here is some information about that reader. 또한 Arduino 라이브러리의 예를 들었습니다. 이 라이브러리는 데이터 읽기에 잘 작동하며 동일한 외부 인터럽트 핀을 사용합니다. https://github.com/monkeyboard/Wiegand-Protocol-Library-for-ArduinoAtmega328의 Wiegand 프로토콜 구현

Google에서 많이 검색했지만 찾을 수있는 C 예제가 없습니다. 제로에서 코드를 작성했지만 작동하지 않았습니다. 일부 출력 데이터를 볼 수는 있지만 실제 데이터와 공통점은 없습니다. 그래서 여기 예가 있습니다 : ID가 0x1532FC이고 출력이 0x94F8 인 Wiegand 26 프로토콜 인 Reader에 카드를 놓습니다.

누군가가 실수를 찾는데 도움이 될 것입니다. 자세한 내용이 필요한 경우

#define F_CPU 16000000 
#include <avr/io.h> 
#include "c:\users\irakli\Documents\Atmel Studio\7.0\wiegand C\wiegand C\UART.h" 
#include <avr/interrupt.h> 
#include <util/delay.h> 

`unsigned long CardID = 0; // DATA 
int bit_count= 0; //Wiegand type 

int Send; 

int DataArray[26] = {}; 
int *ptr = DataArray; 

void WiegandReadD0(void) // INT0 Port PD3 
{ 
    bit_count++; 
    CardID = CardID << 1; 
    _delay_ms(1);  
} 
void WiegandReadD1(void) // INT1 Port PD4 
{ 
    bit_count++; 
    CardID = CardID << 1; 
    CardID = CardID + 0x01; 
    _delay_ms(1); 
} 

void WiegandSendD0(void) // PD5 Send Data0 
{ 
    PORTD = (0 << 5); 
    _delay_us(20); 
    PORTD = (1 << 5); 
    _delay_ms(2); 
} 
void WiegandSendD1(void) // PD6 Send Data1 
{ 
    PORTD = (0 << 6); 
    _delay_us(20); 
    PORTD = (1 << 6); 
    _delay_ms(2); 
} 

void Send_Data() 
{ 
    unsigned long data; 
    int type; 

    data = CardID; 
    type = bit_count; 

    for(int i = 0; i <= (type - 1); i++) // Decimal To Binary Array 
    { 
    if(((1 << i) & data) != 0) 
    { 
     *(ptr + i) = 1; 
    } 
    else 
    { 
     *(ptr + i) = 0; 
    } 
    } // END Of FOR 

    for(int i = (type - 1); i >= 0; --i) //Data Send Function 
    { 
    Send = *(ptr + i); 

    if(Send == 1) 
     WiegandSendD1(); 
    if(Send == 0) 
     WiegandSendD0(); 
    } 
    } 

    int main(void) 
    { 
    Uart_init(); 
    sei(); 

    DDRD = (0 << 3) | (0 << 4); // Input Ports For Reading Wiegand 
    PORTD = (0 << 3) | (0 << 4); // No Pull-up 
    EIMSK = (1 << INT0) | (1 << INT1); // Enable External Interrupts On PD3 
             // and PD4 

    DDRD = (1 << 5) | (1 << 6); // Output Ports For Sending Wiegand. PD5 = 
           // D0, PD6 = D1. 
    PORTD = (1 << 5) | (1 << 6); // PUll-ups Enable 

    while (1) 
    { 
     _delay_ms(1000); 
     printf("Card ID = %ld\t Card HEX = %.x\t Wiegand Type = %d\t\n",CardID, CardID, bit_count); 
     _delay_ms(500); 

     Send_Data(); 

     CardID = 0; 
     bit_count = 0; 
    }  
    } 

    ISR(INT0_vect) 
    {  
     WiegandReadD0(); 
    } 
    ISR(INT1_vect) 
    {  
     WiegandReadD1(); 
    }` 

작성하십시오

그래서 여기 내 코드입니다.

답변

0

바보 같은 실수에 있습니다 : 여기

printf("Card ID = %ld\t Card HEX = %.x\t Wiegand Type = %d\t\n",CardID, CardID, bit_count); 

가 있어야한다 :

printf("Card ID = %l\t Card HEX = %.x\t Wiegand Type = %d\t\n",CardID, CardID, bit_count); 

을! 그러나 누군가이 코드를 사용한다면 출력에 패리티 비트가 포함되어야한다고 생각해야합니다. !! !!