我正在做一个项目,在这个项目中,RFID-RC522读卡器读取RFID卡,将读取的数字输入,然后通过串行继电器输出。代码如下:
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);
String rfidCard;
void setup() {
Serial.begin(9600);
//Serial.println("Starting the RFID Reader...");
SPI.begin();
rfid.init();
}
void loop() {
if (rfid.isCard()) {
if (rfid.readCardSerial()) {
rfidCard = (String(rfid.serNum[0]) + String(rfid.serNum[1]) + String(rfid.serNum[2]) + String(rfid.serNum[3]));
Serial.print(rfidCard);
}
rfid.halt();
}
}这部分工作得很好。在python端,下面的代码在我的计算机上运行,可以很好地读取所有内容:
import serial
import time
connected = False
#This port below is specific to my usb port I think
port = '/dev/cu.usbserial-14620'
baud = 9600
serial_port = serial.Serial(port, baud, timeout=0)
while True:
reading = serial_port.readline().decode()
if reading != '':
print(reading)所以当我把RFID读卡器插到我的arduino Nano上,把Nano插到我的电脑上,然后运行Python代码,最终的结果是:当我把一张RFID卡放到读卡器上时,它会连续打印数字,而当我把它拔出来时,它什么都不会打印。看起来像这样:
786179181
786179181
786179181
786179181
786179181
786179181这正是我想要的。
这就是问题所在。我想在python脚本中引入一段时间,在这段时间内它不会读取任何内容。一种延迟,其中RFID读取器基本上不可用。这段代码是我试图获得的效果的一个最小可重复性的例子:
i = 5
while i > 0:
print(i)
time.sleep(1)
i-=1当我将这段代码添加到Serial初始化行之前时,它会打印一个从5到1的倒计时,然后打开端口并开始读取和打印。但看起来,如果我在倒计时之前将卡放在读卡器上,它会将所有读取的内容添加到缓冲区中,然后一旦端口允许再次打印,就会一次性发送垃圾邮件。对我来说最奇怪的是,它实际上开始循环发送垃圾邮件,即使我把卡拿走了。从现在开始,arduino现在陷入了垃圾数据的状态-即使我终止python脚本并重新运行它,并且不将任何卡放到阅读器上,它仍然会无限循环地发送旧数据。它看起来更像这样,有时堆叠成一行:
786179181786179181786179181786179181
786179181
786179181786179181786179181786179181786179181我尝试过使用flush()、reset_input_buffer()和reset_output_buffer()等命令,但它们似乎不能满足我的需要,或者我可能不完全理解它们的工作原理。我不能完全确定我的问题出在arduino代码输出还是python代码输入。
发布于 2021-07-22 11:55:19
好的,我可以使用下面的方法让它工作。
在arduino中,编写的代码只有在从python接收到内容时才会执行:
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);
String rfidCard;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop() {
if (rfid.isCard()) {
if (rfid.readCardSerial()) {
if (Serial.available()){
rfidCard = (String(rfid.serNum[0]) + String(rfid.serNum[1]) + String(rfid.serNum[2]) + String(rfid.serNum[3]));
Serial.println(rfidCard);
}
}
rfid.halt();
}
}在python中,只有当我想要接收回数据时,即在延迟过后,它才会向arduino发送数据:
import serial
import time
port = '/dev/cu.usbserial-14620'
baud = 9600
serial_port = serial.Serial(port, baud, timeout=1)
i = 5
while i > 0:
print(i)
time.sleep(1)
i-=1
while True:
serial_port.write(b'1')
try:
reading = serial_port.readline().decode().rstrip()
print(reading)
except:
pass这样可以在不收集任何缓冲数据的情况下,一次打印一行数据。
感谢大家的帮助!
https://stackoverflow.com/questions/68476700
复制相似问题