设为首页收藏本站

极客工坊

 找回密码
 注册

只需一步,快速开始

查看: 603|回复: 12

Arduino 外部中断接收韦根信号问题

[复制链接]
发表于 2017-7-17 14:54:18 | 显示全部楼层 |阅读模式
Arduino小白想请问论坛各位大神一个问题,以下是问题详细说明:

小白我想用Arduino UNO的外部中断 attachInterrupt 这个函数去接收韦根接口的读卡器发送过来的数据;

韦根接口读卡器有两根数据线:数据0(Data0)和数据1(Data1)。D0,D1在没有数据输出时都保持+5V高电平。若输出为0,则D0拉低一段时间,若输出为1,则D1拉低一段时间。

根据以上资料,小白我用Arduino的外部中断函数attachInterrupt做了一个测试程序,理论上没数据时是不会触发中断的,程序运行结果应该是一直打印readerCount的个数为0,但是我这边的测试结果是错误的,以下是代码和结果截图,求大神们指教,我到底哪一步出错了???!!!

  1. volatile int readerCount = 0;

  2. void reader0(void)
  3. {
  4.         readerCount++;     //计数加一
  5. }

  6. void reader1(void)
  7. {
  8.         readerCount++;
  9. }

  10. void setup()
  11. {
  12.         Serial.begin(9600);
  13.         attachInterrupt(0, reader0, FALLING);  //当有电平从高电平变为低电平时触发中断
  14.         attachInterrupt(1, reader1, FALLING);
  15. }

  16. void loop()
  17. {
  18.           Serial.println(readerCount);  // 打印个数
  19. }
复制代码

运行结果

运行结果
回复

使用道具 举报

发表于 2017-7-17 16:14:50 | 显示全部楼层
请直接用wg协议库
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-17 16:27:30 | 显示全部楼层
maxims 发表于 2017-7-17 16:14
请直接用wg协议库

请问大神有这库吗?我一直没找着。。
回复 支持 反对

使用道具 举报

发表于 2017-7-17 16:29:07 | 显示全部楼层
本帖最后由 maxims 于 2017-7-17 16:33 编辑
hhhwwwyyy 发表于 2017-7-17 16:27
请问大神有这库吗?我一直没找着。。


有的。我用过这个库,并且是正常可用的。
Wiegand-Protocol-Library-for-Arduino-master.zip (5.63 KB, 下载次数: 0)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-17 16:30:06 | 显示全部楼层
maxims 发表于 2017-7-17 16:29
有的。我用过这个库,并且是正常可用的。

能发一个给我吗?感激不尽  799381192@qq.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 16:34:19 | 显示全部楼层
hhhwwwyyy 发表于 2017-7-17 16:30
能发一个给我吗?感激不尽

4楼有上传。刚才回帖就给你找去了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-17 16:47:31 | 显示全部楼层
maxims 发表于 2017-7-17 16:34
4楼有上传。刚才回帖就给你找去了

好的  收到 非常感谢
回复 支持 反对

使用道具 举报

发表于 2017-7-18 01:16:11 | 显示全部楼层
本帖最后由 Ansifa 于 2017-7-18 01:25 编辑

按你的写了一下,还没硬件验证,可能会出错,大概思路,适用于WG26读卡器。一般10位数的RFID卡都能用

  1. volatile int readerCount = 0;
  2. unsigned long data = 0;
  3. void reader0(void)
  4. {
  5.         readerCount++;     //计数加一
  6.         data = (data << 1);
  7. }

  8. void reader1(void)
  9. {
  10.         readerCount++;
  11.         data = (data << 1) | 1;
  12. }

  13. void setup()
  14. {
  15.         Serial.begin(9600);
  16.         attachInterrupt(0, reader0, FALLING);  //当有电平从高电平变为低电平时触发中断
  17.         attachInterrupt(1, reader1, FALLING);
  18. }

  19. void loop()
  20. {
  21.         if (readerCount >= 26)
  22.         {
  23.                 Serial.println(data, DEC); // 打印卡号
  24.                 readerCount = 0;
  25.                 data = 0;
  26.         }
  27. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-18 09:11:42 | 显示全部楼层
Ansifa 发表于 2017-7-18 01:16
按你的写了一下,还没硬件验证,可能会出错,大概思路,适用于WG26读卡器。一般10位数的RFID卡都能用

恩恩 谢谢大神 你这个逻辑没错 我之前出错在硬件没接好,没有共地,导致读取异常
回复 支持 反对

使用道具 举报

发表于 2017-7-20 20:55:18 | 显示全部楼层
本帖最后由 Ansifa 于 2017-7-20 23:56 编辑
hhhwwwyyy 发表于 2017-7-18 09:11
恩恩 谢谢大神 你这个逻辑没错 我之前出错在硬件没接好,没有共地,导致读取异常


验证了,上述结果数值有错,最终结果需要做一次转换 data = (data& 0x1FFFFFE)>>1。
  1. volatile int readerCount = 0;
  2. unsigned long data = 0;
  3. void reader0(void)
  4. {
  5.         readerCount++;     //计数加一
  6.         data = (data << 1);
  7. }

  8. void reader1(void)
  9. {
  10.         readerCount++;
  11.         data = (data << 1) | 1;
  12. }

  13. void setup()
  14. {
  15.         Serial.begin(9600);
  16.         attachInterrupt(0, reader0, FALLING);  //当有电平从高电平变为低电平时触发中断
  17.         attachInterrupt(1, reader1, FALLING);
  18. }

  19. void loop()
  20. {
  21.         if (readerCount >= 26)
  22.         {
  23.                 data = (data& 0x1FFFFFE)>>1;  //------------新增,按照协议转换为标准卡号,与卡面数字一样
  24.                 Serial.println(data, DEC); // 打印卡号
  25.                 readerCount = 0;
  26.                 data = 0;
  27.         }
  28. }
复制代码
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册  

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )  

GMT+8, 2017-9-20 06:21 , Processed in 0.044417 second(s), 10 queries , File On.

Powered by Discuz! X3.3 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表