Node.js 使用串行端口时停止响应
Node.js stops responding when using serialport
我第一次使用 node.js 通过一个简单的网站来控制电机。
网站上有 2 个按钮:"Left" 和 "Right"。您必须按住 "Left" 或 "Right" 按钮才能转动电机。当您松开按钮时,电机停止。
电机连接到服务器串口上的 Arduino。
它有效,但是
问题
当我在 phone 上使用它并向按钮发送垃圾邮件时,服务器有时会停止响应每个人,直到我重新启动服务器。由于 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
});
});
控制台输出示例:"Left" 单击按钮
Server running...
Left: true //pressed (motor turning left)
Left: false //released (motor stops)
我得到了它的工作。它不是 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);
我第一次使用 node.js 通过一个简单的网站来控制电机。
网站上有 2 个按钮:"Left" 和 "Right"。您必须按住 "Left" 或 "Right" 按钮才能转动电机。当您松开按钮时,电机停止。 电机连接到服务器串口上的 Arduino。 它有效,但是
问题
当我在 phone 上使用它并向按钮发送垃圾邮件时,服务器有时会停止响应每个人,直到我重新启动服务器。由于 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
});
});
控制台输出示例:"Left" 单击按钮
Server running...
Left: true //pressed (motor turning left)
Left: false //released (motor stops)
我得到了它的工作。它不是 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);