Wiegand(韋根)協議是由摩托羅拉公司定制的一種通訊協議,它適用于涉及門禁控制系統的讀卡器和卡片的許多特性。韋根數據輸出由兩條數據線DATA0和DATA1,和公共的信號地GND組成。在沒有數據輸出時,DATA0和DATA1都保持高電平(典型為+5V電平),若輸出'0'時,DATA0輸出低脈沖而DATA1保持為高電平,輸出'1'時,DATA1輸出低脈沖而DATA0保持為高。典型的低脈沖寬度為50us,輸出每一bit之前的間隔為1ms(如下圖,實際的信號電平和時序由實際的韋根讀卡器決定)。
韋根協議包含很多種格式來傳輸串行數據,英創公司工控主板支持最常用的韋根26 bit和韋根34 bit格式。
韋根26是已經廣泛使用的工業標準,一個“韋根包”有26位數據,第1位為第1到第13位的偶檢驗,最后1位為第14到第26位的奇校驗。中間24位為數據位。
韋根26格式定義
對于韋根34格式,即一個“韋根包”有34位數據,第1位為第1到第17位的偶檢驗,最后1位為第18到第34位的奇校驗。中間32位為數據位。
英創公司在WinCE內核中添加了韋根協議解析的設備驅動程序,應用程序只需要打開"WIG1:"設備,然后調用DeviceIoControl等待驅動程序返回(調用DeviceIoControl,應用程序會掛起,不會占用CPU資源),當驅動程序接收到韋根數據后,會自動檢查奇偶校驗,然后由DeviceIoControl返回接收情況,可能返回的原因有:
#defineWG_DATA_VALID 0 // 接收到有效的韋根數據
#defineWG_PARITY_ERROR 1 // 奇偶校驗錯誤
#defineWG_TIMEOUT 2 // 接收數據超時
#defineWG_BIT_LENGTH_ERROR 3 // 不能識別的韋根格式
如果DeviceIoControl返回為0(WG_DATA_VALID),表示接收到有效的韋根數據,應用程序通過ReadFile函數從驅動讀取數據,如果讀回3個字節,表示為韋根 26格式,如果讀回4字節,表示韋根 34格式。ReadFile讀回的數據不包含韋根協議中的頭尾奇偶校驗位,僅為有效的數據位。
如果ReadFile函數返回1個字節,表示接收到韋根讀卡器按鍵信號,驅動程序目前支持4 bit(16個狀態)的鍵盤信號檢測。
韋根信號需要正確連接到英創工控主板后,驅動程序才能正常工作,英創各個主板連接韋根信號的定義如下:
ESM680x / ESM335x / ESM928x / EM335x |
EM9280 / EM9281 / EM9287 | ||
第一路韋根("WIG1:") | Wiegand_DATA0 | GPIO14 | GPIO26 |
Wiegand_DATA1 | GPIO15 | GPIO27 | |
第一路韋根("WIG2:") | Wiegand_DATA0 | GPIO16 | |
Wiegand_DATA1 | GPIO17 |
如前所述,韋根讀卡器通常輸出5V TTL電平,而英創工控主板的GPIO要求輸入電平不能超過3.3V,所以韋根讀卡器輸出的信號需要經過轉換后才能與英創主板的GPIO相連。下圖是一個簡單的5V轉3.3V的電平轉的電路。
下面是應用程序讀取第一路韋根信號("WIG1:")的示例代碼:
#include"stdafx.h"
#include
#include
#include
#include"bsp_drivers.h"
#defineWG_DATA_VALID 0
#defineWG_PARITY_ERROR 1
#defineWG_TIMEOUT 2
#defineWG_BIT_LENGTH_ERROR 3
DWORDWaitWiegandEvent(HANDLE hIRQ, DWORD dwTimeout)
{
DWORD dwReturn = 0;
if(!DeviceIoControl(hIRQ, // file handle to the driver
IOCTL_WAIT_FOR_WIG, // I/O control code
&dwTimeout, // in buffer
sizeof(DWORD), // in buffer size
&dwReturn, // out buffer
sizeof(DWORD), // out buffer size
NULL, // pointer to number of bytes returned
NULL)) // ignored (=NULL)
{
dwReturn = WAIT_FAILED;
}
returndwReturn;
}
int_tmain(intargc, _TCHAR* argv[])
{
HANDLE hWIG;
DWORD dwReturn, dwNumberOfBytesRead, i;
BOOL bRet;
BYTE WIGData[4];
printf("Wiegand(26/34) Demo.\r\n");
hWIG = CreateFile(_T("WIG1:"),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
NULL);
if(hWIG == INVALID_HANDLE_VALUE)
{
printf("Can not open WIG1:\r\n");
return-1;
}
while(TRUE)
{
dwReturn = WaitWiegandEvent(hWIG, INFINITE);
switch( dwReturn )
{
caseWG_DATA_VALID:
dwNumberOfBytesRead = 0;
bRet = ReadFile(hWIG, WIGData,sizeof(WIGData),
&dwNumberOfBytesRead, NULL);
if(bRet)
{
if(dwNumberOfBytesRead == 3 )
printf("WG26:0x");
elseif(dwNumberOfBytesRead == 4)
printf("WG34:0x");
elseif(dwNumberOfBytesRead == 1)
printf("Key:0x");
for( i = 0; i < dwNumberOfBytesRead; i++)
printf("%x", WIGData[i]);
printf("\r\n");
}
break;
caseWG_PARITY_ERROR:
printf("Parity checking error!\r\n");
break;
caseWG_TIMEOUT:
printf("Timeout!\r\n");
break;
caseWG_BIT_LENGTH_ERROR:
printf("Unsupported bit length!\r\n");
break;
default:;
}
}
CloseHandle(hWIG);
return0;
}
-
WINDOWS
+關注
關注
3文章
3541瀏覽量
88628 -
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35296
發布評論請先 登錄
相關推薦
評論