为什么我的处理应用需要更长时间才能响应?

时间:2016-06-20 12:46:08

标签: java serial-port processing

我编写了一个处理应用程序,当接收到串行输入时,该应用程序使屏幕不可见,并且在没有串行输入时再次可见。 (更具体地说,我通过Arduino连接了RFID阅读器,当它读取识别的标签时发送信号)

当我运行应用程序时,它运行得很好。当我删除我的标签时,屏幕变黑,当我更换它时,应用程序再次变得不可见。但是如果我将标签留在阅读器上的时间更长,那么当我将其移除时,屏幕再次变黑也需要更长的时间。但它并不是永久性的:如果标签保持更长时间,则响应速度较慢,反之亦然,即使多次也是如此。

为什么响应时间会发生变化?我忘了关闭某些东西,从而造成内存泄漏吗?延迟是否会随着时间的推移而增加?

这是我的代码:

import processing.serial.*;
Serial myPort;  // Create object from Serial class
String val;     // Data received from the serial port

void setup() {
 String portName = Serial.list()[3]; //change the 0 to a\ 1 or 2 etc. to match your port
  myPort = new Serial(this, portName, 9600); 

  fullScreen();
  surface.setAlwaysOnTop(true); 
  background(000); 
}

void draw() {

  if ( myPort.available() > 0) 
  {  // If data is available,
  val = myPort.readStringUntil('\n');         // read it and store it in val
  } else {
    val=null;}

if (val != null && val.length() > 1) {  //if a serial input is received
 surface.setVisible(false); // make the screen invisible
 }
 else { //otherwise
  surface.setVisible(true); // make the screen visible
}

 delay(50); // wait for 50 ms to stop flickering
}  

1 个答案:

答案 0 :(得分:0)

对于串行库,我不是专家,所以这主要是猜测,但这里有...

只要您将卡片保持在读卡器上,您就可以从中获得持续的数据馈送。这会进入缓冲区,直到您调用readStringUntil()函数为止。

通常这很好,因为你每秒调用readStringUntil()函数60次,所以缓冲区没有机会填满。

但是,由于您调用delay()函数,因此降低了从缓冲区中取出数据的速度。这导致缓冲区填满,这意味着需要更长的时间来读取数据。

换句话说,将缓冲区视为一个桶,顶部有一个开口,底部有一个龙头。只要您将卡片拿到读卡器上,就可以从顶部装满水桶。调用readStringUntil()函数会让一点点脱离插口。只要你继续放开一点点,你就会被你所掌握的东西所吸引。但是如果你放慢打开龙头的速度,你就会比你放出桶更快地填满桶。另一方面,如果你继续打开龙头的速度比将东西添加到顶部要快,那么你就会有时间没有任何东西出现。

要解决此问题,您将需要更全面地了解您的阅读器通过串行连接发送的内容。典型的线包含什么?邮件多久发送一次?相同的数据是一次又一次地重复,还是随着时间的推移而改变?

根据这些问题的答案,您将不得不重写代码,以便更准确地检查该卡当前是否已被读取。