2017-06-17 90 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);