zoukankan      html  css  js  c++  java
  • 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);
              }
            });
          }
        }
    
  • 相关阅读:
    STL容器内数据删除
    grep 同时满足多个关键字和满足任意关键字
    程序运行栈空间不足程序崩溃问题
    VS2010中设置程序以管理员身份运行
    python 包详解
    select 详解
    Hdu 1166
    CF1204C
    CF1204B
    CF1204A
  • 原文地址:https://www.cnblogs.com/flypig666/p/12841340.html
Copyright © 2011-2022 走看看