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);
          }
        });
      }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM