2013-10-19 53 views
0

我正在使用Web界面(節點+ socket.io + node-serialport)發送一個小項目來發送數據傳輸到串口,然後由Arduino讀取設置的引腳高電平,爲led供電(我將稍後轉換爲模型火箭點火系統)。爲什麼Arduino需要在使用之間重置(Node.js + node-serialport + socket.io)

下面我有什麼工作,但也有我以前遇到過,我想,以確保最高的可靠性,以解決兩個基本問題:

  • 爲什麼我到Arduino重置每個之間頁面加載/串行連接爲了這個工作?
  • 爲什麼當我不限制草圖循環執行多少次(通過x)時,即使我只發送一個字符,它也會連續向串口打印數據?

素描

int led = 8; 
int x = 0; 

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

void loop() { 

    if(x < 1) { 
    if(Serial.available() > 0) { 

     Serial.print(1); 

     digitalWrite(led, HIGH); 
     delay(5000); 
     digitalWrite(led, LOW); 

     x++; 
    } 
    } 
} 

app.js(簡稱爲簡潔起見)

socket.on('launch', function(data) { 
    for(var i = 5; i > 0; i--) { 
    socket.emit('countdown', { count: i }); 

    if(i !== 1) { 
     sleep(1); 
    } 
    } 

    serialPort = new SerialPort("/dev/tty.usbserial-A6004amR", { 
    baudrate: 9600 
    }); 

    serialPort.on('open', function (err) { 
    console.log('port opened... Press reset on the Arduino.'); 

    serialPort.on('close', function (err) { 
     console.log('port closed'); 
    }); 

    serialPort.on('error', function (err) { 
     console.log('error: ' + err); 
    }); 

    serialPort.on('data', function(data) { 
     // keeps getting 'data' events when x doesn't limit the loop 
     console.log('data received: ' + data); 
    }); 

    serialPort.write(2, function(err, result) { 
     console.log('sent ' + result + ' chars.'); 
    }); 
    }); 

回答

1

按我的理解,對於第二個問題,它連續打印的原因是你通過Serial.available()檢查串行端口上是否有數據可用,但由於您沒有讀取數據,數據仍爲下次您接觸到聲明時可用。可以使用函數Serial.read()來讀取可用數據並將其從串行緩衝區中刪除。現在,爲了緩解連續打印問題,您已經引入了變量x,這是您的第一個問題背後的根本原因。一旦x的值增加,它將不會被重置爲0,直到您執行arduino的硬件級別重置爲止。所以你可以試試下面的草圖,讓我知道它是否有效?謝謝。

int led = 8; 

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

void loop() { 

    if(Serial.available() > 0) { 
     Serial.read(); //-> if you comment this line out, you can see continuously printing. 
     Serial.print(1); 

     digitalWrite(led, HIGH); 
     delay(5000); 
     digitalWrite(led, LOW); 

    } 
} 
+0

這不會造成無限循環嗎?如果有數據,您正在讀取數據,然後打印1,這會導致循環再次執行,因爲緩衝區中有數據(1)。 – doremi

+0

No. RX引腳用於接收來自主機的數據,引腳TX用於傳輸數據。因此,在RX引腳上讀/可用外觀,而打印寫入TX引腳。 – sraok

相關問題