2017-06-17 95 views
1

我第一次使用node.js和一個簡單的網站來控制電機。使用串口時,Node.js停止響應

在網站上有2個按鈕:「左」和「右」。您必須按住「左」或「右」按鈕才能轉動電機。當你讓按鈕開始馬達停止。 電機連接到服務器上的串行端口上的Arduino。 它的工作原理,但

問題

當我使用我的電話和垃圾郵件的按鈕服務器有時會停止,直到我重新啓動服務器響應爲大家。由於WiFi延遲,我認爲這些功能被稱爲太快。所以我試着在Chrome控制檯中調用這些功能。

LeftPressed();LeftReleased();LeftPressed();LeftReleased(); 

事實上,運行它們幾次後,服務器停止響應。 沒有錯誤,沒有崩潰..

當我刪除motorPort.write(message);保持服務器響應。

如何防止服務器停止響應?

客戶端(Javascript語言,瀏覽器)

function LeftPressed() {  
    socket.emit('steer', { left: true }); 
} 
function LeftReleased() {  
    socket.emit('steer', { left: false }); 
} 
function RightPressed() {   
    socket.emit('steer', { right: true }); 
} 
function RightReleased() {   
    socket.emit('steer', { right: false }); 
} 

服務器(node.js的)

const SerialPort = require("serialport"); 
const express = require('express'); 
const app = express(); 
const server = require('http').createServer(app); 
const io = require('socket.io')(server)  
const motorPort = new SerialPort('/dev/arduinoUnoMicroUSB', { 
    baudrate: 9600, 
}); 

app.use(express.static('web')); 
server.listen(8081, function() { 
    console.log("Server running..."); 
}); 

io.on('connection', function (socket) { 
    socket.on('steer', function (data) { 
     var message = "2"; //stop 

     if (data.left != undefined) { 
      console.log("Left: " + data.left); //log to Console (below) 
      if (data.left) { 
       message = "1" //turn left 
      } 
     }  

     if (data.right != undefined) { 
      console.log("Right: " + data.right); 
      if (data.right) { 
       message = "3"; //turn right 
      } 
     }  

     motorPort.write(message); //send message over serial port    
    }); 
}); 

控制檯輸出例如: 「左」 的按鈕,點擊

Server running... 
Left: true  //pressed (motor turning left) 
Left: false  //released (motor stops) 
+0

嘗試使用sudo使用sudo – Adiii

+0

@Adiii同樣的問題? – MatMis

+0

哪個操作系統您正在使用運行 – Adiii

回答

0

我得到它與這工作。這不是100%完美,但至少服務器保持響應。如果你認爲有更好的辦法,我總是樂於改進。

const SerialPort = require("serialport"); 
const express = require('express'); 
const app = express(); 
const server = require('http').createServer(app); 
const io = require('socket.io')(server); 
const motorPort = new SerialPort('/dev/arduinoUnoMicroUSB', { 
    baudrate: 9600, 
}); 

app.use(express.static('web')); 
server.listen(8081, function() { 
    console.log("Server running..."); 
}); 
var ready = true; 
var NotSendMessages = []; 
io.on('connection', function (socket) { 
    socket.on('steer', function (data) { 
     var message = "2"; //stop 
     if (data.left != undefined) { 
      console.log("Left: " + data.left); 
      if (data.left) { 
       message = "1" //turn left 
      } 
     } 

     if (data.right != undefined) { 
      console.log("Right: " + data.right); 
      if (data.right) { 
       message = "3"; //turn right 
      } 
     } 
     if (!ready) { 
      console.log("cats!!!"); 
      NotSendMessages.push(message); 
     } else { 
      send(message); 
     } 
    }); 
}); 
function send(message) { 
    motorPort.write(message, function() { 
     ready = false; 
     motorPort.drain(function() { 
      motorPort.flush(function() { 
       ready = true; 
      }); 
     }); 
    }); 
} 
setInterval(function() { 
    if (NotSendMessages.length > 0 && ready) { 
     send(NotSendMessages.shift()); 
    } 
}, 50);