參考:
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);
}
});
}
}