2016-08-22 535 views
0

我希望能夠讀取由發送的ascii命令接收到的數據。從NodeJs讀取數據Serialport

下面是發送命令到我的鎖控制器

var express = require('express'); 
var router = express.Router(); 
var SerialPort = require('serialport'); 


/* GET home page */ 
router.get('/', function(request, response){ 


    SerialPort.list(function (err, ports) { 
     ports.forEach(function(port) { 
     console.log(port.comName); 
     console.log(port.pnpId); 
     console.log(port.manufacturer); 
     }); 
    }); 


    var port = new SerialPort("COM5", { 
    baudRate: 38400 
}); 

    port.on('open', function() { 
     // NodeJS v4 and earlier 
     port.write(new Buffer('status1', 'ascii'), function(err) { 
      if (err) { 
      return console.log('Error on write: ', err.message); 
      } 
      console.log('message written'); 

     }); 
    }); 

    // open errors will be emitted as an error event 
    port.on('error', function(err) { 
     console.log('Error: ', err.message); 
    }); 

}); 

// Important 
module.exports = router; 

在文檔中的代碼,它提到的使用解析器的嘗試和讀取數據,https://github.com/EmergingTechnologyAdvisors/node-serialport#serialportparsers--object但我不知道如何實現它,我想在命令status1寫完後執行。

本質上記錄該命令的響應成功地寫入到控制檯

回答

1

有一些特性。
您可以在應用程序啓動時打開端口,並在每個請求上的端口關閉或打開端口上重新連接。它定義瞭如何使用數據流。如果您向端口發送請求,則答案可以包含先前請求的數據(多於一個)。你可以忽略這個問題(如果回答很短並且請求間隔足夠大),或者發送具有此id的分配id和搜索答案的請求。

SerialPort.list(function (err, ports) { 
    ports.forEach(function(port) { 
     console.log(port.comName, port.pnpId, port.manufacturer); // or console.log(port) 
    }); 
}); 

router.get('/', function(req, res){ 
    function sendData(code, msg) { 
     res.statusCode = 500; 
     res.write(msg); 
     console.log(msg); 
    } 

    var port = new SerialPort("COM5", { 
     baudRate: 38400 
    }); 

    port.on('open', function() { 
     port.write(Buffer.from('status1', 'ascii'), function(err) { 
      if (err) 
       return sendData(500, err.message); 

      console.log('message written'); 
     }); 
    }); 

    var buffer = ''; 
    port.on('data', function(chunk) { 
     buffer += chunk; 
     var answers = buffer.split(/\r?\n/); \\ Split data by new line character or smth-else 
     buffer = answers.pop(); \\ Store unfinished data 

     if (answer.length > 0) 
      sendData(200, answer[0]); 
    }); 

    port.on('error', function(err) { 
     sendData(500, err.message); 
    }); 
}); 

module.exports = router; 
+0

謝謝。我遇到了以下錯誤在線var answers = buffer.split('\ n'); \\用新行字符或smth-else分割數據SyntaxError:意外的標記ILLEGAL – John

+1

將''\ n''改爲'/ \ r?\ n /'(我使用另一個分隔符)。 –

+0

謝謝。我將如何驗證我是否從控制器接收到了對命令問題的響應的消息(這也會告訴我們命令是否已經成功接收和理解)? – John