2015-05-08 40 views
0

我使用的serialport節點的Arduino wtih烏諾板進行通信。以下代碼是我用過的。節點的SerialPort

serialPort.on("open", function() { 
    console.log('open'); 
    serialPort.on('data', function(data) { 
    console.log('data received: ' + data); 
    }); 
    serialPort.write('s1\n', function(err, results) { 
    if(err) 
     console.log('err ' + err); 
    else 
     console.log('results ' + results); 
    }); 
});  

當我請輸入作爲從終端「S1」(如TeraTerm或酷期限)我得到一個0或1作爲結果。基本上,s1是讀取特定傳感器狀態的命令。如果傳感器被激活,則返回1,如果不是0則返回。

但是,在上面的代碼片段中,我得到的結果爲3(這是用於輸入的字符串中的字符數)因此,如果我將's11 \ n'放入's1 \ n'中結果返回爲4.我在這裏做錯了什麼?

.on('data')事件從不觸發,但.on('open')事件觸發器,表示與板是好的

+0

你能告訴我解析器的設置是什麼樣的,如下面的行解析器:com .parsers.readline( '\ r \ N')https://github.com/voodootikigod/node-serialport/blob/master/examples/readdata.js – Dino

+0

未定義解析器。 – Aneesh

+0

嘗試將其設置爲'\ n' – Dino

回答

0

寫調用是無阻塞,其結果是bytesWritten,所以你看到的值是有意義雖然仔細檢查docs我也發現了這個超好用注意:

Note: Some devices like the Arduino reset when you open a connection 
to them. In these cases if you immediately write to the device they 
wont be ready to receive the data. This is often worked around by 
having the Arduino send a "ready" byte that your node program waits for 
before writing. You can also often get away with waiting around 400ms. 

我可以證實這是真的。在發送請求之前,我們會等待來自固件的「--start--」消息。

紅利:當Arduino重置時,注意緩衝區中剩餘的垃圾。我看過諸如「TemperatureUpdat - start--」的消息。解決這個問題的兩個想法:

  • 使用endsWith命令掃描「--start--」,而不是完全匹配。缺點是你不能在任何其他消息中使用「--start--」。對你發送的消息很聰明,這成爲一個非問題)。
  • 發送一個空行,然後開始消息(例如,「\ n開始\ n」個)。不足之處在於你需要預期那些2條消息(即,空消息或垃圾或部分消息後跟一個有效的啓動命令)