首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pyserial延迟读取时Arduino串行缓冲区泛洪

使用Pyserial延迟读取时Arduino串行缓冲区泛洪
EN

Stack Overflow用户
提问于 2021-07-22 05:33:37
回答 1查看 44关注 0票数 0

我正在做一个项目,在这个项目中,RFID-RC522读卡器读取RFID卡,将读取的数字输入,然后通过串行继电器输出。代码如下:

代码语言:javascript
复制
#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端,下面的代码在我的计算机上运行,可以很好地读取所有内容:

代码语言:javascript
复制
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卡放到读卡器上时,它会连续打印数字,而当我把它拔出来时,它什么都不会打印。看起来像这样:

代码语言:javascript
复制
786179181
786179181
786179181
786179181
786179181
786179181

这正是我想要的。

这就是问题所在。我想在python脚本中引入一段时间,在这段时间内它不会读取任何内容。一种延迟,其中RFID读取器基本上不可用。这段代码是我试图获得的效果的一个最小可重复性的例子:

代码语言:javascript
复制
i = 5

while i > 0:
   print(i)
   time.sleep(1)
   i-=1

当我将这段代码添加到Serial初始化行之前时,它会打印一个从5到1的倒计时,然后打开端口并开始读取和打印。但看起来,如果我在倒计时之前将卡放在读卡器上,它会将所有读取的内容添加到缓冲区中,然后一旦端口允许再次打印,就会一次性发送垃圾邮件。对我来说最奇怪的是,它实际上开始循环发送垃圾邮件,即使我把卡拿走了。从现在开始,arduino现在陷入了垃圾数据的状态-即使我终止python脚本并重新运行它,并且不将任何卡放到阅读器上,它仍然会无限循环地发送旧数据。它看起来更像这样,有时堆叠成一行:

代码语言:javascript
复制
786179181786179181786179181786179181
786179181
786179181786179181786179181786179181786179181

我尝试过使用flush()reset_input_buffer()reset_output_buffer()等命令,但它们似乎不能满足我的需要,或者我可能不完全理解它们的工作原理。我不能完全确定我的问题出在arduino代码输出还是python代码输入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-22 11:55:19

好的,我可以使用下面的方法让它工作。

在arduino中,编写的代码只有在从python接收到内容时才会执行:

代码语言:javascript
复制
#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发送数据:

代码语言:javascript
复制
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

这样可以在不收集任何缓冲数据的情况下,一次打印一行数据。

感谢大家的帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68476700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档