使用 node.js 识别 Arduino Micro 何时插入 USB

问题描述

首先,我是 node.js 和异步函数概念的新手,非常感谢我能在这里得到的任何帮助。 我一直在尝试使用 node.js 串行端口模块编写脚本来扫描我的 Windows 机器上的端口,并在 Arduino Micro 连接到端口后做一些简单的事情。如果 Arduino 已经连接,下面的工作正常,但我不知道如何扩展它,以便它无限期地等待,直到插入 Micro。如果什么也没找到,它就会终止。

const serialPort = require('serialport');
var portName;

serialPort.list().then(function(ports){
    ports.forEach(function(portInfo){
        if (portInfo.vendorId == 2341 && portInfo.productId == 8037) {
            portName = portInfo.path;
            var myPort = new serialPort(portName);
            myPort.on('open',function() {
                showPortopen();
                myPort.write('RL');   // command to initiate functions in Arduino code
            });
            myPort.on('data',readSerialData);    // echo data from Arduino
            myPort.on('close',showPortClose);
        }
    })
});

function readSerialData(data) {
    console.log(data);
}

function showPortopen() {
    console.log(portName,'opened');
}

function showPortClose() {
    console.log(portName,'closed');
}

解决方法

问题在双倍快速时间内解决。谢谢:-)

不确定这是否是最干净的方法,但通过在端口关闭时重新调用 setInterval 函数,我有一个脚本等待并在插入 USB 后找到 Arduino,如果随后拔下,将再次找到它它再次插入。正是我想要的!

const serialPort = require('serialport');
var portName;

loop();   // start searching for Arduino on a port

function loop() {
    loopId = setInterval(function() {
        serialPort.list().then(function(ports){
            ports.forEach(function(portInfo){
                if (portInfo.vendorId == 2341 && portInfo.productId == 8037) {
                    portName = portInfo.path;
                    var myPort = new serialPort(portName);
                    myPort.on('open',function() {
                        showPortOpen();
                        myPort.write('RL');   // command to initiate Arduino functions
                    });
                    myPort.on('data',readSerialData);   // echo data from Arduino
                    myPort.on('close',showPortClose);
                }
            })
        })
    },1000)
};

function readSerialData(data) {
    console.log(data);
}

function showPortOpen() {
    console.log(portName,'opened');
    clearInterval(loopId);   // stop looping once Arduino found on port
}

function showPortClose() {
    console.log(portName,'closed');
    loop();   // start over when Arduino port is closed
}