2016-06-20 45 views
0

我編寫了一個處理應用程序,它在接收到串行輸入時使屏幕不可見,並且在沒有串行輸入時再次可見。 (更具體地說,我通過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 
} 
+0

爲什麼你在'draw()'函數內調用'delay()'?如果你刪除它會發生什麼? –

+0

這主要是因爲RFID閱讀器不夠好,偶爾會輸出''null''',即使有標籤要讀取。如果我將其刪除,則每次發生處理屏幕時都會變黑,這是每秒幾次。 –

+0

刪除對'delay()'的調用之後,您是否仍然遇到響應時間問題?隨機的null值是我們可以處理的一個單獨的問題。 –

回答

0

我不是專家,當涉及到串行庫,因此這主要是一種猜測,但在這裏不用...

只要您將卡片放在讀卡器上,您可以從中獲取不斷的數據饋送。這進入緩衝區,這將填滿,直到您撥打readStringUntil()函數。

通常情況下這很好,因爲你每秒調用readStringUntil()函數60次,所以緩衝區沒有機會填滿。

但是,由於您調用了delay()函數,因此您正在放慢將數據從緩衝區中取出的速度。這會導致緩衝區填滿,這意味着讀取數據需要更長的時間。

換句話說,將緩衝區視爲頂部有開口並且底部有龍頭的存儲桶。只要你把卡片放在讀卡器上,就可以從頂部裝滿卡片。調用readStringUntil()函數讓一點點不在龍頭上。只要你保持一點點出場,你就會抓住你投入鬥中的東西。但是如果你放慢打開水龍頭的速度,你會比你放出水桶更快。另一方面,如果你繼續打開龍頭的速度比向頂部添加東西的速度快,那麼你會有時間沒有任何東西出現。

要解決此問題,您將不得不更全面地瞭解讀者通過串行連接發送的內容。典型的行包含什麼?信息多久發送一次?相同的數據只是一遍又一遍地重複,還是隨時間而改變?

基於這些問題的答案,您將不得不重寫代碼,以更準確地檢查卡片當前是否被讀卡器佔用。

相關問題