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

    文章

    11215

    浏览量

    208754
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6084

    浏览量

    35164
收藏 人收藏

    评论

    相关推荐

    ​什么是国产工控主板,国产工控主板的特点有哪些?

    什么是国产工控主板呢?国产工控主板是工业计算机的主板,是一种计算机系统的硬件设备,是专门为工业控制场景设计和生产的电路板。它在国内的研发和制
    的头像 发表于 11-07 10:29 75次阅读

    国产工控主板,信产业发展新引擎

    在当今科技飞速发展的时代,信产业正成为国家战略的重要支撑。而我们的国产工控主板,以其卓越的性能和可靠的品质,为信产业的发展注入强大动力。国产工控
    的头像 发表于 11-06 10:29 121次阅读

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 343次阅读

    工控主板有哪些特点?

    动、防尘防水等设计,能够适应工业场景中的各种恶劣条件,具有较长的使用寿命。  扩展性:工控主板通常具有丰富的扩展接口,可以方便地连接各种工业设备和传感器,满足不同工业控制需求。 工业标准支持
    的头像 发表于 10-10 08:55 192次阅读

    国产化背景下的工控主板发展现状

    ,是信息技术应用创新产业的简称,于2016年“信工委会”(信息技术应用创新工作委员会)提出,目的就是要推动我们国内软硬件关键技术的研发
    的头像 发表于 09-21 16:15 295次阅读

    探索国产工控主板:接口类型全解析

    和创新的设计理念,为工业自动化的浪潮注入了源源不断的活力。以下是对 国产工控主板 常见硬件接口的一次深入而专业的解析: 1.PCIe接口 作为工控主板中的高速数据传输通道,PCIe接口
    的头像 发表于 08-13 10:37 458次阅读
    探索国产<b class='flag-5'>工控</b><b class='flag-5'>主板</b>:接口类型全解析

    工控主板在环保智能设备中的应用

    工控主板在环保智能设备中的应用,对于环境监测、资源管理、污染控制等方面起到了至关重要的作用。以下是工控主板在环保智能设备中的一些具体应用:
    的头像 发表于 07-17 15:54 273次阅读
    <b class='flag-5'>工控</b><b class='flag-5'>主板</b>在环保智能设备中的应用

    浅析安卓工控主板的优势

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

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

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

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

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

    工控机主板和普通商用级主板有什么区别?

    工控机主板和普通商用级主板都属于工业主板范畴,其与普通主板拥有本质区别,下面就分析一下工控主板
    的头像 发表于 05-13 15:07 491次阅读

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

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

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

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

    购买工控主板的三大误区

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

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

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