0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术Linux工控主板对韦根信号的支持

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-04 10:46 次阅读

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位为数据位。

对于韦根34格式,即一个“韦根包”有34位数据,常见的格式为第1位为第1到第17位的偶校验,最后1位为第18到第34位的奇校验,中间32位为数据位。

英创公司为Linux工控主板提供了支持韦根协议的设备驱动模块,在命令行输入insmod wiegand-gpio.ko即完成驱动程序的加载。linux韦根驱动支持应用程序通过非阻塞的轮询操作(select)和异步通知的方式读取韦根数据,这里我们建议使用非阻塞轮询方式。以非阻塞方式O_NONBLOCK打开设备文件后,使用num = read(fd,buffer,len)读取韦根数据,只读取Site Code和User Code,不包含奇偶校验位,各参数意义如下:

输入参数:

fd:int, 韦根设备文件描述符;

len:buffer长度,固定4字节,小于4字节提示错误;

输出参数:

buffer:char *, read结果缓存,固定4字节,根据不同返回值num,具有不同意义;

返回值:

num:int, 读取成功时,表示读取的字节数,具体意义如下:

num = 4,读取成功,数据格式为wiegand 34,buffer [0-1]为Site Code,buffer [2-3]为User Code;

num = 3,读取成功,数据格式为wiegand 26,buffer [0]=0,buffer [1]为Site Code,buffer [2-3]为User Code;

num = 1,读取成功,数据格式为键盘按键(部分读卡器有此功能),buffer [0]=0, buffer [1]为按键值;

num = -1,读取失败,buffer [0]存错误码:

-1//格式错误,长度不匹配

-2//偶校验错误

-3//奇校验错误

-4//用户传入buffer空间太小

英创各个主板连接韦根信号的定义如下:

Wiegand_DATA0 Wiegand_DATA1
ESM928x / ESM335x / EM335x GPIO14 GPIO15
EM9280 / EM9281 / EM9287 GPIO26 GPIO27

韦根读卡器通常输出5V TTL电平,而英创工控主板的GPIO要求输入电平不能超过3.3V,所以韦根读卡器输出的信号需要经过转换后才能与英创主板的GPIO相连。下图是一个简单的5V转3.3V的电平转的电路,WG_DATA0和WG_DATA1为韦根读卡器输出信号,注意要将韦根读卡器与英创工控主板共地。

以下是读取韦根数据的应用程序示例代码:

#include

#include

#include

#include

#include

#include

#defineWIEGAND_ERROR_FORMAT -1 //格式错误,长度不匹配

#defineWIEGAND_ERROR_EVEN_PARITY -2 //偶校验错误

#defineWIEGAND_ERROR_ODD_PARITY -3 //奇校验错误

#defineWIEGAND_ERROR_LESS_BUF -4 //用户传入buf空间太小

intexitflag; //退出标志

charbuffer[4]; //read结果

intreadWiegandThreadFunc(void* lparam)

{

intfd = * (int*)lparam;

fd_set fdRead;

structtimeval aTime;

intret;

while(1)

{

FD_ZERO(&fdRead);

FD_SET(fd,&fdRead);

aTime.tv_sec = 2; //s

aTime.tv_usec = 0; //us

ret =select( fd+1, &fdRead, NULL, NULL, &aTime );

if( ret>0 )

{

if( FD_ISSET(fd, &fdRead) )

{

//用户可以在此加入处理操作

intnum = 0;

num =read(fd,buffer,4);

if(num < 0)

{

interrorCode = (signedchar)buffer[0];

printf("ERROR:read failed! num: %d\n",num);

switch(errorCode)

{

caseWIEGAND_ERROR_FORMAT:

printf("ERROR CODE: %d, wiegand data format did not match wiegand-26,weigand-34 or 4 bits for keyboard!\n",errorCode);

break;

caseWIEGAND_ERROR_EVEN_PARITY:

printf("ERROR CODE: %d, wiegand data even parity was wrong!\n",errorCode);

break;

caseWIEGAND_ERROR_ODD_PARITY:

printf("ERROR CODE: %d, wiegand data odd parity was wrong!\n",errorCode);

break;

caseWIEGAND_ERROR_LESS_BUF:

printf("ERROR CODE: %d, buffer was too small, please set it to 4 bytes!\n",errorCode);

break;

default:

printf("ERROR CODE: %d, Unknown Error!\n",errorCode);

break;

}

}

else

{

printf("result: %x,%x,%x,%x\n",buffer[0],buffer[1], buffer[2], buffer[3]);

}

}

}

if( exitflag==1 )//exitflag在程序其他线程中改变

{

printf("exit!\n");

break;

}

}

pthread_exit( NULL );

return0;

}

intmain(intargc,char* argv[])

{

intfd;

inti = 0;

exitflag = 0;

fd =open("/dev/em9280_wiegand",O_RDONLY | O_NONBLOCK);

if(fd < 0)

{

printf("ERROR:open failed!\n");

return-1;

}

pthread_attr_t attr;

pthread_t m_thread;

int res;

res = pthread_attr_init(&attr);

if( res!=0 )

{

printf("Create attribute failed\n" );

}

// 设置线程绑定属性

res = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );

// 设置线程分离属性

res += pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );

if( res!=0 )

{

printf( "Setting attribute failed\n" );

}

// 创建select线程,在此线程中读韦根数据

res = pthread_create( &m_thread, &attr, (void*(*) (void*))&readWiegandThreadFunc, &fd );

if( res!=0 )

{

return-1;

}

pthread_attr_destroy( &attr );

while(1)

{

//执行其他任务

printf("%d\n",i++);

sleep(1);

if(i==50)

{

exitflag = 1;

printf("over\n");

break;

}

}

close(fd);

return0;

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11030

    浏览量

    207241
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6068

    浏览量

    34723
收藏 人收藏

    评论

    相关推荐

    浅析安卓工控主板的优势

    安卓工控主板作为专为工业控制领域设计的硬件平台,相较于普通商用主板,拥有诸多优势,以满足工业环境对稳定、可靠、长期运行的严格要求。以下是安卓工控主板
    的头像 发表于 06-27 14:50 76次阅读

    使用工控主板时该注意哪些事项?

    最近大家都在频繁问一个问题就是工控主板在什么人为情况下容易出现故障,从而造成工控主板的损坏,那今天小编就来讲讲,我们在使用工控
    的头像 发表于 06-05 16:01 164次阅读
    使用<b class='flag-5'>工控</b><b class='flag-5'>主板</b>时该注意哪些事项?

    工控主板容易出现故障的原因有哪些?

    最近大家都在频繁问一个问题就是工控主板在什么人为情况下容易出现故障,从而造成工控主板的损坏,那今天小编就来讲讲,我们在使用工控
    的头像 发表于 05-17 10:57 132次阅读

    工控主板的性能指标有哪些?

    工控主板是工业控制领域中的关键组成部分,它承载着工控系统的核心功能。因此,工控主板的性能指标是评估其质量和性能的重要标准。本文将介绍
    的头像 发表于 05-10 16:27 528次阅读
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>的性能指标有哪些?

    工控主板和普通主板的区别有哪些

    工控主板和普通主板是两种在计算机硬件领域中常见的主板类型,它们在设计、功能和用途上有着明显的区别。工控
    的头像 发表于 04-25 16:54 331次阅读
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>和普通<b class='flag-5'>主板</b>的区别有哪些

    购买工控主板的三大误区

    最近有很多人问我什么样的工控主板算好的,有没有一个统一的标准。工控主板作为整机的核心组成部分,在性能稳定上有着至关重要的作用,那今天小编就来给大家讲解一下在购买
    的头像 发表于 04-16 16:40 170次阅读

    工控主板和普通主板的区别:功能定制化与通用性的差异

    工控主板作为工业控制系统和自动化设备的核心组成部分,其稳定性和耐用性备受关注。然而,有人好奇地问道:工控主板是否能够用于个人电脑系统中呢?为了解答这个问题,我们需要深入了解
    的头像 发表于 03-22 14:15 325次阅读

    科技创新赋能国产工控主板,助推工业数字化新篇章

    随着信息技术的飞速发展,工业数字化已经成为推动新型工业化的重要力量。工业数字化是将信息技术与传统制造业相融合,通过智能化、网络化和自动化等手段,实现了传统工业向智能制造的转型。这种转型不仅提高了生产
    的头像 发表于 02-26 16:40 260次阅读

    探秘工控主板中的BIOS:为什么它如此重要?

    固件,承载着初始化系统硬件和传递信息的重要任务。当工控主板加电时,BIOS会对硬件设备进行自检,通过读取硬件的配置信息来判断硬件是否正常工作,这一过程是
    的头像 发表于 01-23 11:28 387次阅读

    工控主板大揭秘:选对主板,让工业控制更高效

    在当今技术依赖的时代,工控电脑在工业和商业场景中越来越普遍。为了确保工控电脑的稳定性和可靠性,选择合适的主板至关重要。国产工控
    的头像 发表于 01-12 14:11 331次阅读

    工控机主板与嵌入式主板的区别是什么?

    在计算机硬件中,主板是至关重要的组成部分,它连接并控制着所有的硬件设备。然而,根据其设计和使用场景的不同,主板可以被分为多种类型,选择合适的主板对于不同的嵌入式系统应用来说至关重要。那么工控机
    的头像 发表于 11-16 10:29 1300次阅读
    <b class='flag-5'>工控机主板</b>与嵌入式<b class='flag-5'>主板</b>的区别是什么?

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    什么是工控主板,国产工控主板的设计特性

    工控主板是专门用于工业电脑的主板,其设计特性独特且适应工业环境的需求。国产工控主板在元器件选择、抗干扰性和接口设计等方面具有独到之处。
    的头像 发表于 08-28 14:13 405次阅读

    工控主板和普通主板的区别

    工控主板(Industrial Control Board)和普通主板(Consumer Motherboard)是两种针对不同领域和应用的类型主板,它们在设计和功能上存在一些明显的区
    的头像 发表于 08-04 14:27 1053次阅读

    什么是嵌入式工控主板,嵌入式工控主板的分类和应用有哪些?

    什么是嵌入式工控主板,嵌入式工控主板的分类和应用有哪些这样的问题,相信对于很多不懂行的人或者是初学者来说,相信一定会很懵逼,那么今天小编就为您一一解答:
    的头像 发表于 07-05 11:15 739次阅读