2012-07-25 44 views
0

我正在做一個項目與arduino做鈴鐺,當我第一次嘗試,它的工作原理是如何我想(wait(Serial.read())),但現在我需要通過串行端口發送超過100個0才能使其顯示4秒。這是我的Java代碼:Arduino - 需要瘋狂的0的數量,使LED持續3秒

int ledPin = 13; 

void setup() { 
    pinMode(ledPin, OUTPUT); 
    Serial.begin(9600); 
} 

void loop() { 
    if(Serial.available() > 0) { 
     digitalWrite(ledPin, HIGH); 
     delay(Serial.read()); 
     digitalWrite(ledPin, LOW); 
    } 
} 

有誰看到一個錯誤在我的代碼: 爲longness

Main.ringBell("100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); 

public static void ringBell(String length) throws Exception { 
    output.write(length.getBytes()); 
    output.flush(); 
} 

這裏是Arduino的草圖準備?如果是這樣,請讓我知道什麼是錯的,我會解決它。

謝謝。

回答

5

您不會向arduino發送一個大數字,而是發送幾個ASCII字節。 Arduino的會看到這樣的順序:

49, 48, 48, 48, 48, 48, ... 

在每次循環會讀一個字節,並等待數毫秒。 49或48毫秒不是很長時間。所以你所擁有的是LED的恆定閃爍,它能快速地用眼睛看到。

接下來的事情是:你在一次沖洗中發送字節。但是Arduino只有一個64字節的小內部緩衝區(見available文件)。剩下的就被忘記了。

大致計算:64字節*(每字節48毫秒的延遲)爲3072毫秒。是的,這聽起來似乎合理。

接下來的事情是:delay只能處理類型爲unsigned long的參數,它是32位,可以轉換爲~4,000,000,000毫秒,您可以等待。你在Main中的論點超出了這個限制。

因此:最簡單的方法是使用parseInt而不是read。並且在Main中只提供正數int(0 .. 32767)範圍內的數字。在發送下一個ringBell之前,還要在您的Main中進行一些延遲。

+0

謝謝,我會嘗試。 – cheese5505 2012-07-25 20:14:21

+0

雖然有所改進,但發送「8000」時仍然不響8秒鐘。我用「parseInt()」替換了「read()」,這就是造成差異的原因,所以你知道如何讓它在8秒內運行「8000」? – cheese5505 2012-07-28 23:32:53

+0

您可以將'parseInt'的結果存儲到一個變量中,並將其打印到'Serial'流中。然後,通過比較發送的內容和接收的內容,您可以更輕鬆地在Arduino「串行監視器」中測試代碼。 – 2012-07-29 07:45:24