簡體   English   中英

Node.js和serialport; 回調方法?

[英]Node.js and serialport ; Callback method?

我正在嘗試列出所有串行端口,並選擇以/dev/cu.usbmodem開頭的端口名稱。 為了上下文; 它是連接到RaspberryPi運行節點的arduino。 Raspberry Pi習慣於在每次重啟時重命名端口。

到目前為止,我有這個:

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')
});

哪種回調或構造技術將使第二條語句在執行之前等待第一個語句聲明變量?

以下功能假定結果端口中只有一個串行端口。 我將您的ports.forEach更改為標准的for循環。 我相信此循環中正在進行的工作是同步的。 我認為forEach是同步的,但是我知道for(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);
});

Raspberry Pi習慣於在每次重啟時重命名端口。

好了,您還可以為正在使用的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"

要找出USB設備的供應商ID,產品ID和序列號,請使用:

dmesg
lsusb

拔下有問題的設備,將其重新插入,並應將其映射到:

/dev/arduinoUno
/dev/arduinoMega

或者,您可以這樣做以尋找正確的端口並自動連接! 它可以在OS X和Ubuntu上很好地工作,我還沒有在Raspi上對其進行測試,但是您明白了。 感謝ChrisCM的“ for” :)

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);

查找可以用於自動連接的模式。

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM