hhhwwwyyy 发表于 2017-7-17 14:54:18

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

Arduino小白想请问论坛各位大神一个问题,以下是问题详细说明:

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

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

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

volatile int readerCount = 0;

void reader0(void)
{
      readerCount++;   //计数加一
}

void reader1(void)
{
      readerCount++;
}

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

void loop()
{
          Serial.println(readerCount);// 打印个数
}

maxims 发表于 2017-7-17 16:14:50

请直接用wg协议库

hhhwwwyyy 发表于 2017-7-17 16:27:30

maxims 发表于 2017-7-17 16:14
请直接用wg协议库

请问大神有这库吗?我一直没找着。。

maxims 发表于 2017-7-17 16:29:07

本帖最后由 maxims 于 2017-7-17 16:33 编辑

hhhwwwyyy 发表于 2017-7-17 16:27
请问大神有这库吗?我一直没找着。。

有的。我用过这个库,并且是正常可用的。

hhhwwwyyy 发表于 2017-7-17 16:30:06

maxims 发表于 2017-7-17 16:29
有的。我用过这个库,并且是正常可用的。

能发一个给我吗?感激不尽[email protected]

maxims 发表于 2017-7-17 16:34:19

hhhwwwyyy 发表于 2017-7-17 16:30
能发一个给我吗?感激不尽

4楼有上传。刚才回帖就给你找去了

hhhwwwyyy 发表于 2017-7-17 16:47:31

maxims 发表于 2017-7-17 16:34
4楼有上传。刚才回帖就给你找去了

好的收到 非常感谢

Ansifa 发表于 2017-7-18 01:16:11

本帖最后由 Ansifa 于 2017-7-18 01:25 编辑

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

volatile int readerCount = 0;
unsigned long data = 0;
void reader0(void)
{
        readerCount++;   //计数加一
        data = (data << 1);
}

void reader1(void)
{
        readerCount++;
        data = (data << 1) | 1;
}

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

void loop()
{
        if (readerCount >= 26)
        {
                Serial.println(data, DEC); // 打印卡号
                readerCount = 0;
                data = 0;
        }
}

hhhwwwyyy 发表于 2017-7-18 09:11:42

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

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

Ansifa 发表于 2017-7-20 20:55:18

本帖最后由 Ansifa 于 2017-7-20 23:56 编辑

hhhwwwyyy 发表于 2017-7-18 09:11
恩恩 谢谢大神 你这个逻辑没错 我之前出错在硬件没接好,没有共地,导致读取异常

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

void reader1(void)
{
      readerCount++;
      data = (data << 1) | 1;
}

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

void loop()
{
      if (readerCount >= 26)
      {
                data = (data& 0x1FFFFFE)>>1;//------------新增,按照协议转换为标准卡号,与卡面数字一样
                Serial.println(data, DEC); // 打印卡号
                readerCount = 0;
                data = 0;
      }
}

hhhwwwyyy 发表于 2017-7-21 16:24:00

Ansifa 发表于 2017-7-20 20:55
验证了,上述结果数值有错,最终结果需要做一次转换 data = (data& 0x1FFFFFE)>>1。

感谢 大神指点,测试成功了

hhhwwwyyy 发表于 2017-7-26 15:23:27

maxims 发表于 2017-7-17 16:34
4楼有上传。刚才回帖就给你找去了

大神 我还想问下您,我用了您的韦根库,用Aduino连接两个韦根读头,两个读头同时开启通信,接受数据时我怎么判断这个数据是来自于哪个读头?请大神赐教:loveliness:

maxims 发表于 2017-7-26 22:33:45

hhhwwwyyy 发表于 2017-7-26 15:23
大神 我还想问下您,我用了您的韦根库,用Aduino连接两个韦根读头,两个读头同时开启通信,接受数据时我 ...

这个你得看你的读头有没有类似中断IRQ之类的引脚了。
页: [1]
查看完整版本: Arduino 外部中断接收韦根信号问题