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);
          }
        });
      }
    }
原文地址:https://www.cnblogs.com/flypig666/p/12841340.html