webAPI serial——串口连称

news2024/10/2 18:20:33

在这里插入图片描述

重点

  • 关闭正在读的串口
    借鉴文章:webapi串口
async closeport() {
  this.$emit("changeSerialStatus", false);
  //这里要注意,一定要关闭读取
  this.status = false;
  //取消后,done会变成true,会执行reader.releaseLock();
  this.reader.cancel();
},

vue组件

<template>
  <div>
    <el-button @click="setPort" v-if="!status">连接串口</el-button>
    <el-button @click="closeport" v-if="status">关闭串口</el-button>
    <!-- <el-button @click="changeWgtStatus">重新称重</el-button> -->
    <!-- <label class="pl15">注:当前页面称配置的串口是{{ serialInfo.portName }}</label> -->
  </div>
</template>

<script>
export default {
  name: "serialSelect",
  props: {
    serialInfo: {
      type: Object,
      require: true,
      default: () => {},
    },
  },
  data() {
    return {
      wgtStatus: true, //是否传输重量
      lastWeight: null, //最后一次重量
      count: 4, //重量判稳次数
      times: 0, //重量获取次数
      port: null,
      reader: null,
      setIntervalName: "", //轮询的名称
      dataFirstTime: null, //判稳第一次的时间戳
      standardTimes: null, //设置的判稳时间
      status: false,
      //baudRate: "1200",
      //regexVal: "/[1-9]+/"
    };
  },
  created() {
    // this.count = this.serialInfo.stableTimes;
    this.standardTimes = this.serialInfo.dataTime; //this.serialInfo.stableTimes * this.serialInfo.retrievalDelay;
    /*  this.$modal.confirm("请选择相应串口连接").then((res) => {
      this.setPort();
    }); */
  },
  methods: {
    // 重新获取串口重量
    retrieveWgt() {
      this.wgtStatus = true;
      this.lastWeight = null;
    },
    changeWgtStatus() {
      this.wgtStatus = true;
      this.dataFirstTime = Date.now();
      this.$emit("changeColor", "red");
      this.$emit("getWgt", null);
      this.$emit("updateWgt", true);
    },
    async setPort() {
      this.port = await navigator.serial.requestPort();
      this.getPort();
    },
    async getPort() {
      let port = this.port;
      await port
        .open({ baudRate: this.serialInfo.baudRate })
        .then((res) => {
          this.status = true;
        })
        .catch((res) => {
          this.wgtStatus = false;
          this.status = false;
          this.$emit("changeSerialStatus", false);
          console.log("error:", res);
        })
        .finally((res) => {
          this.wgtStatus = true;
          this.status = true;
          this.$emit("changeSerialStatus", true);
          console.log("finally:", res);
        });
      while (port.readable && this.status) {
        this.reader = port.readable.getReader();
        try {
          while (true) {
            const { value, done } = await this.reader.read();
            if (done) {
              // 允许稍后关闭串口。
              this.reader.releaseLock();
              break;
            }
            let _this = this;
            // if (value && this.wgtStatus) {
            // 不判断状态了,一直读
            if (value) {
              _this.getwgt(value);
              /* this.setIntervalName = setInterval(() => {
                _this.getwgt(value);
                value = null;
              }, this.serialInfo.retrievalDelay); */
            }
          }
        } catch (error) {
          console.log("处理非致命的读错误", error);
          // TODO: 处理非致命的读错误。
        } finally {
          // 允许稍后关闭串口。
          this.reader.releaseLock();
        }
      }
      //这里一定要关闭,不要在关闭方法中close
      await port.close();
    },
    getwgt(value) {
      let result = this.Utf8ArrayToStr(value);
      // result = "+0001048"; // +0000
      console.log("收到的数据:", result, result.includes("-"));
      // 看重量是不是+开始的
      if (!result.includes("+") && !result.includes("-")) return;
      const flagSymbol = result.includes("-") ? "-" : "";
      // const resultArr = result.match(eval(this.serialInfo.regexVal));
      const resultNum = result.slice(1);
      // 取的数大于设置的最小值,改到父页面判断
      // if (!resultNum || Number(resultNum) / 10 <= this.serialInfo.minWgt) return;
      if (!resultNum) return;
      let wgt = Number(resultNum) > 0 ? Number(resultNum) / 10 : 0;
      wgt = flagSymbol ? flagSymbol + wgt : wgt;
      // this.$emit("getWgt", wgt);
      if (this.lastWeight == wgt) {
        const lastDataTime = Date.now();
        const dataTime = lastDataTime - this.dataFirstTime;
        // if (this.times >= this.count) {
        console.log(this.wgtStatus, dataTime);
        if ((this.wgtStatus || flagSymbol) && dataTime >= this.standardTimes) {
          this.dataFirstTime = Date.now();
          this.lastWeight = null;
          if (wgt > 0) {
            this.wgtStatus = false;
            this.$emit("changeColor", "green");
          } else {
            this.wgtStatus = true;
            this.$emit("changeColor", "red");
          }
          this.$emit("getWgt", wgt);
        }
      } else {
        this.dataFirstTime = Date.now();
        this.lastWeight = wgt;
        if (this.wgtStatus) {
          this.$emit("changeColor", "red");
          this.$emit("getWgt", wgt);
        }
      }
    },
    //utf8转字符串
    Utf8ArrayToStr(array) {
      var out, i, len, c;
      var char2, char3;

      out = "";
      len = array.length;
      i = 0;
      while (i < len) {
        c = array[i++];
        switch (c >> 4) {
          case 0:
          case 1:
          case 2:
          case 3:
          case 4:
          case 5:
          case 6:
          case 7:
            // 0xxxxxxx
            out += String.fromCharCode(c);
            break;
          case 12:
          case 13:
            // 110x xxxx 10xx xxxx
            char2 = array[i++];
            out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));
            break;
          case 14:
            // 1110 xxxx 10xx xxxx 10xx xxxx
            char2 = array[i++];
            char3 = array[i++];
            out += String.fromCharCode(
              ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0)
            );
            break;
        }
      }

      return out;
    },
    async closeport() {
    //这是我用于父页面切换手输或者连接串口的状态
      this.$emit("changeSerialStatus", false);
      this.status = false;
      this.reader.cancel();
    },
  },

  beforeDestroy() {
    console.log("离开");
    this.closeport();
  },
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1241242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32 MicroPython 颜色及二维码识别⑫

ESP32 MicroPython 颜色及二维码识别⑫ 1、颜色识别2、二维码识别 1、颜色识别 使用AI颜色识别功能&#xff0c;可以实现颜色辨别、颜色追踪等应用。颜色识别模型内置有9种常见的颜色识别和一种颜色学习识别模式。他们分别是&#xff1a; ai.COLOR_RED 表示识别红色 ai.COLOR…

【C语言】深入解开指针(四)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

使用 PowerShell 创建共享目录

在 Windows 中&#xff0c;可以使用共享目录来将文件和文件夹共享给其他用户或计算机。共享目录可以通过网络访问&#xff0c;这使得它们非常适合用于文件共享、协作和远程访问。 要使用 PowerShell 创建共享目录&#xff0c;可以使用 New-SmbShare cmdlet。New-SmbShare cmdl…

【C++高阶(四)】红黑树深度剖析--手撕红黑树!

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 红黑树 1. 前言2. 红黑树的概念以及性质3. 红黑…

图像分类原理

一、什么是图像分类(Image Classification) 图像分类任务是计算机视觉中的核心任务&#xff0c;其目标是根据图像信息中所反映的不同特征&#xff0c;把不同类别的图像区分开来。 二、图像分类任务的特点 对于人来说&#xff0c;完成上述的图像分类任务简直轻而易举&#xf…

Elasticsearch:FMA 风格的向量相似度计算

作者&#xff1a;Chris Hegarty 在 Lucene 9.7.0 中&#xff0c;我们添加了利用 SIMD 指令执行向量相似性计算的数据并行化的支持。 现在&#xff0c;我们通过使用融合乘加 (Fused Mulitply-Add - FMA) 进一步推动这一点。 什么是 FMA 乘法和加法是一种常见的运算&#xff0c;…

聚观早报 |快手Q3营收;拼多多杀入大模型;Redmi K70E开启预约

【聚观365】11月23日消息 快手Q3营收 拼多多杀入大模型 Redmi K70E开启预约 华为nova 12系列或下周发布 亚马逊启动“AI就绪”新计划 快手Q3营收 财报显示&#xff0c;快手第三季度营收279亿元&#xff0c;同比增长20.8%&#xff1b;期内盈利21.8亿元&#xff0c;去年同期…

梁培强:塑造下一代投资高手

在当前全球经济动荡和金融市场快速变化的背景下&#xff0c;梁培强的投资教育计划不仅仅是一套课程&#xff0c;它是对传统投资理念的深度挑战和革新。梁培强&#xff0c;拥有超过二十年金融行业经验的资深分析师&#xff0c;正在引领一场投资者教育的变革&#xff0c;旨在培养…

基于深度学习的文本分类

通过构建更复杂的深度学习模型可以提高分类的准确性&#xff0c;即分别基于TextCNN、TextRNN和TextRCNN三种算法实现中文文本分类。 项目地址&#xff1a;zz-zik/NLP-Application-and-Practice: 本项目将《自然语言处理与应用实战》原书中代码进行了实现&#xff0c;并在此基础…

Oracle的控制文件多路复用,控制文件备份,控制文件手工恢复

一.配置控制文件多路复用 1.查询Oracle的控制文件所在位置 SQL> select name from v$controlfile;NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/fast_recovery_a…

SpringBoot集成七牛云OSS详细介绍

&#x1f4d1;前言 本文主要SpringBoot集成七牛云OSS详细介绍的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&a…

geemap学习笔记012:如何搜索Earth Engine Python脚本

前言 本节主要是介绍如何查询Earth Engine中已经集成好的Python脚本案例。 1 导入库 !pip install geemap #安装geemap库 import ee import geemap2 搜索Earth Engine Python脚本 很简单&#xff0c;只需要一行代码。 geemap.ee_search()使用方法 后记 大家如果有问题需…

进程间通信(管道/消息队列/共享内存/信号量)

目录 一、进程间通信介绍1.1 进程间通信的目的1.2 进程间通信的发展1.3 进程间通信的分类 二、管道2.1 什么是管道&#xff1f;2.2 匿名管道2.3 实现匿名管道通信的代码2.4 用fork来共享管道原理2.5 站在文件描述符角度-深度理解管道2.6 站在内核角度-管道本质2.7 管道读写的规…

2023 年 亚太赛 APMCM (C题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 问题一 为了分析中国新能源电动汽车发展的主要因素&#xf…

电线电缆行业生产管理怎么数字化?

行业介绍 随着市场环境的变化和现代生产管理理念的不断更新&#xff0c;电缆的生产模式也在发生转变&#xff0c;批量小&#xff0c;规格多&#xff0c;交期短的新型制造需求逐年上升&#xff0c;所以企业车间管理的重要性越发凸显&#xff0c;作为企业良性运营的关键&#xf…

MySQL--慢查询(一)

1. 查看慢查询日志是否开启 show variables like slow_query%; show variables like slow_query_log; 参数说明&#xff1a; 1、slow_query_log&#xff1a;这个参数设置为ON&#xff0c;可以捕获执行时间超过一定数值的SQL语句。 2、long_query_time&#xff1a;当SQL语句执行…

汇编-PUSHFD和POPFD标志寄存器值压栈和出栈

PUSHFD指令将32位EFLAGS寄存器内容压入堆栈&#xff0c; 而POPFD指令则将栈顶单元内容弹出到EFLAGS寄存器 格式&#xff1a;

【开源】基于Vue和SpringBoot的学校热点新闻推送系统

项目编号&#xff1a; S 047 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S047&#xff0c;文末获取源码。} 项目编号&#xff1a;S047&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新…

opencv- CLAHE 有限对比适应性直方图均衡化

CLAHE&#xff08;Contrast Limited Adaptive Histogram Equalization&#xff09;是一种对比度有限的自适应直方图均衡化技术&#xff0c;它能够提高图像的对比度而又避免过度增强噪声。 在OpenCV中&#xff0c;cv2.createCLAHE() 函数用于创建CLAHE对象&#xff0c;然后可以…

MYSQL索引使用注意事项

索引使用注意事项&#xff1a; 1.索引列运算 不要在索引列上进行运算操作&#xff0c;否则索引将失效&#xff1b; 2.字符串不加引号 字符串类型使用时&#xff0c;不加引号&#xff0c;否则索引将失效&#xff1b; 3.模糊查询 如果仅仅是尾部模糊匹配&#xff0c;索引将不会失…