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);// 打印个数
} 请直接用wg协议库 maxims 发表于 2017-7-17 16:14
请直接用wg协议库
请问大神有这库吗?我一直没找着。。 本帖最后由 maxims 于 2017-7-17 16:33 编辑
hhhwwwyyy 发表于 2017-7-17 16:27
请问大神有这库吗?我一直没找着。。
有的。我用过这个库,并且是正常可用的。
maxims 发表于 2017-7-17 16:29
有的。我用过这个库,并且是正常可用的。
能发一个给我吗?感激不尽[email protected] hhhwwwyyy 发表于 2017-7-17 16:30
能发一个给我吗?感激不尽
4楼有上传。刚才回帖就给你找去了 maxims 发表于 2017-7-17 16:34
4楼有上传。刚才回帖就给你找去了
好的收到 非常感谢 本帖最后由 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;
}
} Ansifa 发表于 2017-7-18 01:16
按你的写了一下,还没硬件验证,可能会出错,大概思路,适用于WG26读卡器。一般10位数的RFID卡都能用
恩恩 谢谢大神 你这个逻辑没错 我之前出错在硬件没接好,没有共地,导致读取异常 本帖最后由 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;
}
} Ansifa 发表于 2017-7-20 20:55
验证了,上述结果数值有错,最终结果需要做一次转换 data = (data& 0x1FFFFFE)>>1。
感谢 大神指点,测试成功了 maxims 发表于 2017-7-17 16:34
4楼有上传。刚才回帖就给你找去了
大神 我还想问下您,我用了您的韦根库,用Aduino连接两个韦根读头,两个读头同时开启通信,接受数据时我怎么判断这个数据是来自于哪个读头?请大神赐教:loveliness: hhhwwwyyy 发表于 2017-7-26 15:23
大神 我还想问下您,我用了您的韦根库,用Aduino连接两个韦根读头,两个读头同时开启通信,接受数据时我 ...
这个你得看你的读头有没有类似中断IRQ之类的引脚了。
页:
[1]