Wiegand(韋根)協(xié)議是由摩托羅拉公司定制的一種通訊協(xié)議,它適用于涉及門禁控制系統(tǒng)的讀卡器和卡片的許多特性。韋根數(shù)據(jù)輸出由兩條數(shù)據(jù)線DATA0和DATA1,和公共的信號地GND組成。在沒有數(shù)據(jù)輸出時,DATA0和DATA1都保持高電平(典型為+5V電平),若輸出'0'時,DATA0輸出低脈沖而DATA1保持為高電平,輸出'1'時,DATA1輸出低脈沖而DATA0保持為高。典型的低脈沖寬度為50us,輸出每一bit之前的間隔為1ms(如下圖,實際的信號電平和時序由實際的韋根讀卡器決定)。
韋根協(xié)議包含很多種格式來傳輸串行數(shù)據(jù),英創(chuàng)公司工控主板支持最常用的韋根26 bit和韋根34 bit格式。
韋根26是已經(jīng)廣泛使用的工業(yè)標準,一個“韋根包”有26位數(shù)據(jù),第1位為第1到第13位的偶檢驗,最后1位為第14到第26位的奇校驗。中間24位為數(shù)據(jù)位。
韋根26格式定義
對于韋根34格式,即一個“韋根包”有34位數(shù)據(jù),第1位為第1到第17位的偶檢驗,最后1位為第18到第34位的奇校驗。中間32位為數(shù)據(jù)位。
英創(chuàng)公司在WinCE內(nèi)核中添加了韋根協(xié)議解析的設(shè)備驅(qū)動程序,應(yīng)用程序只需要打開"WIG1:"設(shè)備,然后調(diào)用DeviceIoControl等待驅(qū)動程序返回(調(diào)用DeviceIoControl,應(yīng)用程序會掛起,不會占用CPU資源),當驅(qū)動程序接收到韋根數(shù)據(jù)后,會自動檢查奇偶校驗,然后由DeviceIoControl返回接收情況,可能返回的原因有:
#defineWG_DATA_VALID 0 // 接收到有效的韋根數(shù)據(jù)
#defineWG_PARITY_ERROR 1 // 奇偶校驗錯誤
#defineWG_TIMEOUT 2 // 接收數(shù)據(jù)超時
#defineWG_BIT_LENGTH_ERROR 3 // 不能識別的韋根格式
如果DeviceIoControl返回為0(WG_DATA_VALID),表示接收到有效的韋根數(shù)據(jù),應(yīng)用程序通過ReadFile函數(shù)從驅(qū)動讀取數(shù)據(jù),如果讀回3個字節(jié),表示為韋根 26格式,如果讀回4字節(jié),表示韋根 34格式。ReadFile讀回的數(shù)據(jù)不包含韋根協(xié)議中的頭尾奇偶校驗位,僅為有效的數(shù)據(jù)位。
如果ReadFile函數(shù)返回1個字節(jié),表示接收到韋根讀卡器按鍵信號,驅(qū)動程序目前支持4 bit(16個狀態(tài))的鍵盤信號檢測。
韋根信號需要正確連接到英創(chuàng)工控主板后,驅(qū)動程序才能正常工作,英創(chuàng)各個主板連接韋根信號的定義如下:
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電平,而英創(chuàng)工控主板的GPIO要求輸入電平不能超過3.3V,所以韋根讀卡器輸出的信號需要經(jīng)過轉(zhuǎn)換后才能與英創(chuàng)主板的GPIO相連。下圖是一個簡單的5V轉(zhuǎn)3.3V的電平轉(zhuǎn)的電路。
下面是應(yīng)用程序讀取第一路韋根信號("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
+關(guān)注
關(guān)注
4文章
3567瀏覽量
89226 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35573
發(fā)布評論請先 登錄
相關(guān)推薦
評論