electron制作上位机软件篇使用serialport进行串口通信
Posted flypig666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了electron制作上位机软件篇使用serialport进行串口通信相关的知识,希望对你有一定的参考价值。
参考:
https://serialport.io/docs/guide-usage
https://blog.csdn.net/chen_soldier/article/details/86848318
https://www.jianshu.com/p/65e2afa199f9
https://github.com/serialport/node-serialport/blob/5.0.0-beta3/README.md
https://blog.csdn.net/u012612399/article/details/80421730
一、使用serialport指南
我主要使用的几个串口方法:
串口初始化:
this.port = new Serialport(‘COM4‘, {
baudRate: 4800, //波特率
dataBits: 8, //数据位
parity: "none", //奇偶校验
stopBits: 1, //停止位
flowControl: false,
autoOpen: false
});
1、打开串口
const port = new SerialPort(‘COM口‘,xxxx); // 初始化的串口
port.open(function (err) {
if (err) {
return console.log(‘Error opening port: ‘, err.message)
}
// Because there‘s no callback to write, write errors will be emitted on the port:
port.write(‘main screen turn on‘)
})
2、发送指令
// 发送指令01,以十六进制发送,senddata为自定义需要发送的指令
var senddata = [0x01, 0x0d, 0x0a];
port.write(senddata,function(error) {
if (error) {
console.log("发送指令失败");
} else {
console.log("发送指令成功");
// 此处可以写监听器部分,监听下位机的返回内容
}
})
3、监听串口
ps:开启监听器前,需先清除所有的监听,否则使用setInterval持续监听会产生多个监听器导致报错
port.removeAllListeners(); //清除所有监听器
port.on(‘data‘, function (data) {
console.log(‘Data:‘, data) // data为监听到的内容,即下位机返回的数据
})
4、关闭串口
port.close(function(error) {
if (error) {
console.log("关闭串口失败");
} else {
console.log("关闭串口成功");
}
});
附上部分实例代码:
// 关闭串口
closePort() {
let _this = this;
if (_this.port != null) {
_this.port.close(function(error) {
if (error) {
console.log("关闭串口失败");
} else {
_this.port = null;
_this.isOpen = false;
clearInterval(_this.timer);
console.log("关闭串口成功");
_this.portBtn = "打开串口";
}
});
} else {
console.log("串口未打开");
}
}
// 打开串口
openPort(name) {
console.log(this.portSelect);
if (name == "") {
console.log("请选择串口");
} else {
this.port = new Serialport(name, {
baudRate: this.baudRateSelect, //波特率
dataBits: this.dataBitsSelect, //数据位
parity: this.paritySelect, //奇偶校验
stopBits: this.stopBitsSelect, //停止位
flowControl: false,
autoOpen: false
});
let _this = this;
// 发送指令01,以十六进制发送
var senddata = [0x01, 0x0d, 0x0a];
_this.port.open(function(error) {
if (error) {
console.log("打开端口" + name + "错误:" + error);
} else {
_this.isOpen = true;
_this.portBtn = "关闭串口";
console.log("打开端口成功,正在监听数据中");
// 发送指令
// const buf = new Buffer(senddata, "hex");
// console.log(buf);
// _this.port.setMaxListeners(1);
var sendOrder = function() {
_this.port.write(senddata, function(error) {
if (error) {
console.log("发送指令失败");
} else {
console.log("发送指令成功");
// 清除所有的监听,始终保持只有一个监听器,否则会出现多个监听器叠加导致内存泄漏
_this.port.removeAllListeners();
_this.port.on("data", function(data) {
console.log("recv: " + data.toString("hex"));
var recv = data.toString("hex");
var insertElement = document.createElement("p");
var insertSpan = document.createElement("span");
var time = _this.getCurrentDateTime();
insertSpan.innerText = "[" + time + "]:";
insertSpan.setAttribute("class", "m-header");
var yhum = parseInt(recv.substring(2, 6), 16) / 10;
console.log("湿度:" + yhum);
console.log(data);
var ytemp = parseInt(recv.substring(6, 10), 16) / 10;
console.log("温度:" + ytemp);
// 拦截爆值
if (yhum > 100 || ytemp > 50) {
sendOrder();
} else {
var pojo = {};
pojo.yhum = yhum;
pojo.ytemp = ytemp;
console.log(pojo);
var str = JSON.stringify(pojo);
// var json = document.createTextNode(data.toString("hex"));
var json = document.createTextNode(str);
insertElement.appendChild(insertSpan);
insertElement.appendChild(json);
document
.getElementById("receiveData")
.appendChild(insertElement);
_this.sendJson = pojo;
console.log(_this.sendJson);
_this.sendJsonData(pojo);
}
});
console.log(
"监听数量:" + _this.port.listeners("data").length
);
}
});
};
sendOrder();
_this.timer = setInterval(sendOrder, 60000);
}
});
}
}
以上是关于electron制作上位机软件篇使用serialport进行串口通信的主要内容,如果未能解决你的问题,请参考以下文章