2013-07-31 120 views
0

我試圖列出所有串行端口並選擇以/dev/cu.usbmodem開頭的端口名稱。對於上下文;它是一個連接到RaspberryPi運行節點的arduino。每次重新啓動時,Raspberry Pi都有重新命名端口的習慣。Node.js和serialport;回調方法?

到目前爲止,我有這樣的:

com.list(function (err, ports) { 
    ports.forEach(function(port) { 
    var arduinoPort = port.comName; 
if (arduinoPort.substring(0, 16) == "/dev/cu.usbmodem") { 
     var SERIALPORT_ID = arduinoPort; 
    } 
    }); 
}); 

這需要足夠長的時間,這接下來的語句失敗的SERIALPORT_ID變量尚未聲明;

var serialPort = new com.SerialPort(SERIALPORT_ID, { 
    baudrate: 57600, 
    parser: com.parsers.readline('\r\n') 
}); 

什麼回調或結構技術將第二條語句等待第一個在執行前聲明變量?

回答

2

下面的函數假設在結果端口中只有一個串口。我將你的ports.forEach改爲循環標準。我相信在這個循環中進行的工作是同步的。我認爲forEach是同步的,但我知道(var i = 0; ....)是同步的,如果我們只有一個適當的'端口',那麼我們希望能夠跳過循環其他結果。如果我對「只有一個好端口」的假設是錯誤的,那麼這個邏輯很容易改變。

function getSerialPort(callback) { 
    'use strict'; 

    com.list(function (err, ports) { 

     for (var i = 0; i < ports.length; i++) {//ports.forEach works too, but I know this is sync, and that's what we want in this case so we can break out of the loop when we find the right port 
      var port = ports[i]; 
      var arduinoPort = port.comName; 

      if (arduinoPort.substring(0, 16) === "/dev/cu.usbmodem") { 

       var serialPort = new com.SerialPort(arduinoPort, { 
        baudrate: 57600, 
        parser: com.parsers.readline('\r\n') 
       }); 

       callback(serialPort); 
       return;//I'm not sure what return does in a ports.forEach situation, so I changed it to a standard for loop, so that we know that this is breaking us out of it. 
      } 
     } 
    }); 
} 

getSerialPort(function (serialPort) { 
    'use strict'; 
    console.log('Serial Port: ' + serialPort); 
}); 
+0

This Works great!我需要在我的應用程序中刪除'嚴格使用',因爲一旦端口收到數據,它就會阻塞一些功能。 – Jack

1

的樹莓派有每次被 重啓時重命名端口的習慣。

那麼,你也可以爲你使用的USB硬件創建一些udev規則,這樣arduino將總是映射到同一個串口。假設您正在運行Debian ...

vim /etc/udev/rules.d/98-usb-serial.rules 

SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0044", ATTRS{serial}=="64935343733351F072D0", SYMLINK+="arduinoUno" 
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", ATTRS{serial}=="7523230313535121B0E1", SYMLINK+="arduinoMega" 

要了解供應商ID,產品ID和序列號USB設備的使用:

dmesg 
lsusb 

拔下設備問題,插回來,它應該映射到:

/dev/arduinoUno 
/dev/arduinoMega 
1

或者你可以做到這一點,尋找合適的端口和自動連接! 它在OS X和Ubuntu上效果很好,我還沒有在Raspi上測試過它,但你明白了。 感謝ChrisCM爲「爲」 :)

var myPort; 

function getSerialPort(callback) { 

    com.list(function (err, ports) { 

     for (var i = 0; i < ports.length; i++) {//ports.forEach works too, but I know this is sync, and that's what we want in this case so we can break out of the loop when we find the right port 
      var port = ports[i]; 

       if(port.pnpId.indexOf("duino") != -1 || port.manufacturer.indexOf("duino") != -1 || port.comName.indexOf('moti') != -1){ // it look for "duino" somewhere 
        myPort = new SerialPort(port.comName,{ 
        baudrate: 115200, 
        parser: serialport.parsers.readline("\r\n"), 
       }); 

       callback(serialPort); 
       return;//I'm not sure what return does in a ports.forEach situation, so I changed it to a standard for loop, so that we know that this is breaking us out of it. 
      } 
     } 
    }); 
} 

getSerialPort(function (myPort) { 
    console.log('Serial Port: ' + myPort); 
}); 

還可以使用輸出所有端口的規格:

console.log("pnpId: " + port.pnpId); 
console.log("manufacturer: " + port.manufacturer); 
console.log("comName: " + port.comName); 
console.log("serialNumber: " + port.serialNumber); 
console.log("vendorId: " + port.vendorId); 
console.log("productId: " + port.productId); 

找到,你可以使用自動連接的模式。

希望它有幫助!