10

node.js サーバー スクリプトから arduino と通信しようとしています。

これが私のコードです:

var app = require('express')()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server)
, SerialPort  = require('serialport').SerialPort;

//SERIAL
var portName = '/dev/ttyACM0';
var sp = new SerialPort(); // instantiate the serial port.
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary
   baudRate: 115200, // this is synced to what was set for the Arduino Code
   dataBits: 8, // this is the default for Arduino serial communication
   parity: 'none', // this is the default for Arduino serial communication
   stopBits: 1, // this is the default for Arduino serial communication
   flowControl: false // this is the default for Arduino serial communication
});

//SERVER
server.listen(80, '127.0.0.5');

app.get('/', function (req, res){
  res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function (socket){
  socket.emit('test', { test: 'Its Working' });
  socket.on('value', function (data){
    console.log(data);
    });
});

次の理由により、デバイスが /dev/ttyACM0 にあると確信しています。

pi@raspberrypi ~/Programming/node $ dmesg|tail
[91569.773042] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
[91569.776338] usbcore: registered new interface driver cdc_acm
[91569.776369] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[92601.131298] usb 1-1.2: USB disconnect, device number 7
[92609.044999] usb 1-1.2: new full-speed USB device number 8 using dwc_otg
[92609.149759] usb 1-1.2: New USB device found, idVendor=2341, idProduct=0043
[92609.149789] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[92609.149806] usb 1-1.2: Manufacturer: Arduino (www.arduino.cc)
[92609.149820] usb 1-1.2: SerialNumber: 74132343430351705051
[92609.156743] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
pi@raspberrypi ~/Programming/node $

サーバースクリプトを実行しようとすると、次のエラーが表示されます。

pi@raspberrypi ~/Programming/node $ node server.js
   info  - socket.io started

/home/pi/node_modules/serialport/serialport.js:72
    throw new Error('Invalid port specified: ' + path);
          ^
Error: Invalid port specified: undefined
    at new SerialPort (/home/pi/node_modules/serialport/serialport.js:72:11)
    at Object.<anonymous> (/home/pi/Programming/node/server.js:8:10)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

単純なものが欠けているだけだと確信していますが、LinuxまたはNodeについて十分に理解していないため、それが何であるかを知ることができません。ドライバー用に arduino IDE をインストールする必要がありますか? ラズベリーパイにsshingしているためですか、これがシリアルポートを使用していることは知っていますが、USB経由で通信したいです。これは可能ですか、それとも USB かシリアルかに関係なく、シリアル ポートは 1 つしかありませんか?

EDIT IDE をインストールしました。IDE を介して arduino と通信できます。したがって、ドライバーやポートの不足ではありません。

助けてくれてありがとう。

ジョー

4

3 に答える 3

9

SerialPort後でopenで指定する空の引数が原因だと思います

var sp = new SerialPort(); // instantiate the serial port.
//then you open
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary

SerialPort npm プロジェクト ページから

var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("/dev/tty-usbserial1");

When opening a serial port, you can specify (in this order).
 1. Path to Serial Port - required.
 2. Options - optional and described below.

したがって、open ではなく SerialPort ですべての引数を指定する必要があります。

var portName = '/dev/ttyACM0';
var sp = new SerialPort(portName, {
   baudRate: 115200,
   dataBits: 8,
   parity: 'none',
   stopBits: 1,
   flowControl: false
});
于 2013-02-22T17:46:43.233 に答える
0

nodeJS / arduino / Serialport ロボットが動作しています。

私は使用しました(シリアルポートを自分のものに変更する必要があります)

  var serialport = require("serialport");
  var SerialPort = serialport.SerialPort; // localize object constructor

  var sp = new SerialPort(comPort, {
     parser: serialport.parsers.readline("\r"),
     baudrate: 9600
  });

  sp.on("open", function () {
     sp.write(0x80);
     sp.write('123456\r');
     console.log ("comm port ready");
  });

出力を「排出」するためにArduinoに書き込むときは覚えておいてください。ロボットに特定の方向に進むように指示する作業コード。

            robotData.setLastCommand(direction);
    sp.write(direction , function(err, results) {
        **sp.drain(function(err, result){**
                //console.log ("drain");
                    //console.log(err, result);
        });
        //console.log ("results -> " + results);
    });
于 2014-02-21T21:10:16.293 に答える
0

たぶん、このコードは誰かを助けることができます. Raspberry PI Zero W で実行します。

パーサーを使用して固定長のバイト (この例では 16) を取得し、最初の文字が列であるかどうかを確認します。

var SerialPort = require('serialport');
var port = new SerialPort('/dev/ttyAMA0', {
   baudRate: 57600,
   dataBits: 8,
   parity: 'none',
   stopBits: 1,
   flowControl: false
});

var ByteLength = require('@serialport/parser-byte-length');
var parser = port.pipe(new ByteLength({length: 16}));


parser.on('data', function (data) {
    var dataUTF8 = data.toString('utf-8');
    if (dataUTF8.substring(0, 1) === ":") {
        console.log('Data: ' + data);
    }
});

注: このページは、私のように RPI シリアルでトラブルを経験したことがある人に役立ちます。

于 2018-09-14T15:09:02.897 に答える