0

すべてのシリアル ポートを一覧表示し、/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')
});

最初のステートメントが変数を宣言するまで 2 番目のステートメントを待機させてから実行するコールバックまたは構造化手法はどれですか?

4

3 に答える 3

2

以下の関数は、結果ポートにシリアル ポートが 1 つしかないことを前提としています。あなたのports.forEachを標準のforループに変更しました。このループで進行中の作業は同期的だったと思います。forEach は同期だと思いますが、 for(var i = 0; ....) が同期であることはわかっています。適切な「ポート」が 1 つしかない場合は、他の結果のループをスキップできるようにしたいと考えています。「1 つの適切なポートのみ」という私の仮定が正しくない場合、このロジックは簡単に変更できます。

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);
});
于 2013-07-31T13:30:35.773 に答える
1

または、正しいポートを探して自動的に接続することもできます! OS X と Ubuntu でうまく動作します。Raspi ではまだテストしていませんが、アイデアはわかります。「for」の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);

自動接続に使用できるパターンを見つけるために。

それが役に立てば幸い!

于 2013-08-21T14:35:41.913 に答える
1

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
于 2013-08-15T15:35:04.987 に答える