モーターを制御し、センサーを読み取る 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);
});