3

モーターを制御し、センサーを読み取る Arduino プロジェクトに取り組んでいます。いずれかのライブラリ (SerialPort および SerialPort2) を使用して、シリアル ポートからブラウザーへの読み取り/書き込みを行うためのメディア チャネルとしてNode.jsを使用する Web ビューを使用することにしました。

ワイヤーを使用して Arduino を USB デバイスに直接接続すると、どちらも正常に動作しますが、ワイヤレス アダプター ** ( APC220 )を介して Arduino を USB デバイスに接続すると、Node.js は何も読み取れないようです。Arduinoシリアルモニターを使用して、受信したすべてを読み取ることができます。

その背後にある考えられるすべての理由を確認しました。無線シリアルと APC220 およびブリッジ コネクタ (USB-to-serial コンバーター) との Arduino 通信に使用しているボーレートを確認しました。それらはすべて同じ設定です: 9600 ボーレート、パリティ/フロー制御なし、データ ビット: 8 、ストップ ビット: 1。

動作は次のとおりです。問題なくCOM ポートに接続し、エラーを印刷しようとしましたが、SerialPort ライブラリによって識別されるものはないようです。次に、イベント (データ) に読み取りが行われません。つまり、イベント (Node.js) は、シリアルポートが開いていても、シリアルポートと対話していません。

注: USB ポートとワイヤレス アダプターの間の媒体として別の Arduino を使用できることはわかっていますが、この問題を理解し、そのような回避策なしできれいに解決したいと考えています。

問題は何でしょうか?

サーバー [node.js]:

var SerialPort  = require('serialport2').SerialPort;
var portName = 'COM15';

var io = require('socket.io').listen(8000); // Server listens for socket.io communication at port 8000
io.set('log level', 1); // Disables debugging. This is optional. You may remove it if desired.

var sp = new SerialPort(); // Instantiate the serial port.
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary
   baudRate: 9600, // This is synchronised 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
});

io.sockets.on('connection', function (socket) {
    // If socket.io receives message from the client browser then
    // this call back will be executed.
    socket.on('message', function (msg) {
        console.log(msg);
    });
    // If a web browser disconnects from Socket.IO then this callback is called.
    socket.on('disconnect', function () {
        console.log('disconnected');
    });
});

var cleanData = ''; // This stores the clean data
var readData = '';  // This stores the buffer
sp.on('data', function (data) { // Call back when data is received
    readData = data.toString(); // Append data to buffer.
    // If the letters '[' and ']' are found on the buffer then isolate what's in the middle
    // as clean data. Then clear the buffer.
    console.log(readData); // **Here you should be able to print the data if you receive any**
     if (readData.indexOf(']') >= 0 && readData.indexOf('[') >= 0) {
        cleanData = readData.substring(readData.indexOf('[') + 1, readData.indexOf(']'));
        readData = '';
        console.log("-- "+cleanData);
        io.sockets.emit('message', cleanData);
     }else if(readData.indexOf('[') >= 0){
        cleanData = readData.substring(readData.indexOf('[') + 1, readData.length);
        readData = '';
     }else if(readData.indexOf(']') >= 0){
        cleanData += readData.substring(0, readData.indexOf(']'));
        readData = '';
        console.log("-- "+cleanData);
        io.sockets.emit('message', cleanData);
     }else{
        cleanData += readData;
        readData = '';
     }
    //console.log(readData);
    //io.sockets.emit('message', readData);
});
4

2 に答える 2