使用 Pyserial 延迟读取时 Arduino 串行缓冲区泛洪
Arduino Serial Buffer Flooding When Reading is Delayed using Pyserial
我正在做一个项目,其中 RFID-RC522 reader 读取 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 方面,以下代码 运行s 在我的电脑上并且可以正常读取所有内容:
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 reader 插入我的 arduino Nano 并将 Nano 插入我的计算机时,运行 Python 代码的最终结果是:当我把直到 reader 的 RFID 卡,它不断打印数字,当我将它拉开时,它什么也不打印。看起来像这样:
786179181
786179181
786179181
786179181
786179181
786179181
正是我想要的。
这里是问题开始的地方。我想在 python 脚本中引入一段时间,它不会读取任何内容。 RFID reader 基本上不可用的一种延迟。此代码是我试图获得的效果的最小可重现示例:
i = 5
while i > 0:
print(i)
time.sleep(1)
i-=1
当我在串行初始化行之前添加此代码时,它会打印从 5 到 1 的倒计时,然后打开端口并开始读取和打印。但是看起来如果我在倒计时结束之前将卡放在 reader 上,它会将它读取的所有内容添加到缓冲区,然后在允许端口再次打印后立即发送垃圾邮件。对我来说最奇怪的是它实际上开始循环发送垃圾邮件,即使我拿走了卡。从现在开始,arduino 现在陷入了这种发送垃圾数据的状态——即使我终止了 python 脚本并重新 运行 它,并且不要将任何卡放在 reader,它仍在无限循环中发送旧数据。它看起来更像这样,有时会堆叠成一行:
786179181786179181786179181786179181
786179181
786179181786179181786179181786179181786179181
我尝试过使用 flush()
、reset_input_buffer()
和 reset_output_buffer()
等命令,但它们似乎没有按照我的意愿行事,或者我可能没有完全了解它们是如何工作的。我不完全确定我的问题是出在arduino代码输出还是python代码输入上。
好的,我可以使用以下方法让它工作。
在 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
这具有一次打印一行数据而不收集任何缓冲区数据的预期效果。
谢谢大家的帮助!
我正在做一个项目,其中 RFID-RC522 reader 读取 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 方面,以下代码 运行s 在我的电脑上并且可以正常读取所有内容:
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 reader 插入我的 arduino Nano 并将 Nano 插入我的计算机时,运行 Python 代码的最终结果是:当我把直到 reader 的 RFID 卡,它不断打印数字,当我将它拉开时,它什么也不打印。看起来像这样:
786179181
786179181
786179181
786179181
786179181
786179181
正是我想要的。
这里是问题开始的地方。我想在 python 脚本中引入一段时间,它不会读取任何内容。 RFID reader 基本上不可用的一种延迟。此代码是我试图获得的效果的最小可重现示例:
i = 5
while i > 0:
print(i)
time.sleep(1)
i-=1
当我在串行初始化行之前添加此代码时,它会打印从 5 到 1 的倒计时,然后打开端口并开始读取和打印。但是看起来如果我在倒计时结束之前将卡放在 reader 上,它会将它读取的所有内容添加到缓冲区,然后在允许端口再次打印后立即发送垃圾邮件。对我来说最奇怪的是它实际上开始循环发送垃圾邮件,即使我拿走了卡。从现在开始,arduino 现在陷入了这种发送垃圾数据的状态——即使我终止了 python 脚本并重新 运行 它,并且不要将任何卡放在 reader,它仍在无限循环中发送旧数据。它看起来更像这样,有时会堆叠成一行:
786179181786179181786179181786179181
786179181
786179181786179181786179181786179181786179181
我尝试过使用 flush()
、reset_input_buffer()
和 reset_output_buffer()
等命令,但它们似乎没有按照我的意愿行事,或者我可能没有完全了解它们是如何工作的。我不完全确定我的问题是出在arduino代码输出还是python代码输入上。
好的,我可以使用以下方法让它工作。
在 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
这具有一次打印一行数据而不收集任何缓冲区数据的预期效果。
谢谢大家的帮助!