webAPI serial——串口连称

在这里插入图片描述

重点

  • 关闭正在读的串口
    借鉴文章: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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人机交互——机器人形态

1.聊天机器人 2.任务型机器人 3.面向FAQ的问答机器人 4.面向KB的问答机器人

Golang基础-面向过程篇

文章目录 基本语法变量常量函数import导包匿名导包 指针defer静态数组动态数组(slice)定义方式slice追加元素slice截取 map定义方式map使用方式 基本语法 go语言输出hello world的语法如下 package mainimport ("fmt""time" )func main() {fmt.Println(&…

公网环境固定域名异地远程访问内网BUG管理系统

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

传输层协议 - TCP(Transmission Control Protocol)

文章目录&#xff1a; TCP 协议关于可靠性TCP 协议段格式序号与确认序号六个标志位16位窗口大小 确认应答&#xff08;ACK&#xff09;机制超时重传机制连接管理机制连接建立&#xff08;三次握手&#xff09;连接终止&#xff08;四次挥手&#xff09;TIME_WAIT 状态CLOSE_WAI…

【Vue】响应式与数据劫持

目录 前言 响应式 Vue的响应式是如何实现的 数据劫持 Vue中的data属性都具有响应式 Vue后期添加的属性如何使其具有响应式 数组的响应式处理 如何使用数组下标去修改可以具有响应式呢 前言 什么是响应式&#xff1f;数据劫持是什么&#xff1f;Vue响应式是如何实现的&a…

成都瀚网科技有限公司抖音带货靠谱么

近年来&#xff0c;随着社交媒体的兴起&#xff0c;越来越多的企业开始利用抖音等短视频平台进行产品推广和销售。成都瀚网科技有限公司也紧跟潮流&#xff0c;通过抖音平台进行带货。那么&#xff0c;成都瀚网科技有限公司的抖音带货靠谱么&#xff1f;本文将从以下几个方面进…

深入分析TaskView源码之触摸相关

问题背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;android 10以后TaskView作为替代ActivityView的容器&#xff0c;在课程的分屏pip自由窗口专题也进行了相关的详细介绍分析。 这里再补充一下相关的TaskView和桌面内嵌情况下的触摸分析 主要问题点&#xff…

Java零基础-Maven项目构建(最详细)

【Maven】 1.当前开发中存在的问题 1.1. 一个项目就是一个工程 如果项目非常庞大,就不适合继续使用package划分模块.最好是每一个模块对应一个项目,利于分工协作,也利于项目针对性能化的部署. 1.2. 项目中需要的jar包必须拷贝 项目中的jar包需要手动"复制" "粘…

【C++心愿便利店】No.14---C++之探索list底层原理

文章目录 前言一、list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list operations1.2.7 list的迭代器失效 二、list的模拟实现2.1 定义一个结构体实现list的…

配置Java环境变量不生效的解决办法

问题&#xff1a; 直接更换Java_HOME的JDK安装路径后&#xff0c;竟然环境变量不生效&#xff0c;在cmd窗口输入java -version或者javac -version后报错&#xff1f;&#xff1f;&#xff1f;这是为什么呢&#xff1f; 问题剖析&#xff1a; 在使用安装版本的JDK程序时&#…

循环链表2

循环链表的实现 对于数据结构中所有的结构而言&#xff0c;每一次都是用之前初始化&#xff08;处理一开始的随机值&#xff09;一下&#xff0c; 用完销毁&#xff08;不管有没有malloc都能用&#xff0c;用了可以保证没有动态内存泄漏了&#xff09;一下 而在C里面&#x…

激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

jdk9.0.1下载、安装、配置

下载路径xIndex of java-local/jdk/9.0.111 安装 环境变量配置 新增变量&#xff1a;JAVA_HOME 值&#xff1a;安装路径 path中新增&#xff1a;%JAVA_HOME%\bin

裸片-PCBA

裸片 PCBA&#xff0c; 薄膜&#xff0c; 邦定-COB&#xff08;chip on board&#xff09;技术是指将裸芯片直接贴在PCB 板上&#xff0c;然后用铝线或金线进行电子连接的技术

【软件工程师从0到1】- 封装 (知识汇总)

前言 介绍&#xff1a;大家好啊&#xff0c;我是hitzaki辰。 社区&#xff1a;&#xff08;完全免费、欢迎加入&#xff09;日常打卡、学习交流、资源共享的知识星球。 自媒体&#xff1a;我会在b站/抖音更新视频讲解 或 一些纯技术外的分享&#xff0c;账号同名&#xff1a;hi…

数据结构与算法实验(黑龙江大学)

实验一 顺序存储的线性表&#xff08;2 学时&#xff09; 一、实验目的 1 、掌握线性表的逻辑结构特征。 2、熟练掌握线性表的顺序存储结构的描述方法。 3 、熟练掌握顺序表上各种基本操作的实现。 二、实验内容 1 、设线性表的数据元素都为整数&#xff0c;存放在顺序表…

infercnv 三回首:深入理解infercnv为何能发nature

大家好&#xff0c;不知你是否还记得&#xff0c;前两次关于infercnv的介绍。请看这里&#xff1a; 肿瘤单细胞转录组拷贝数分析结果解读和应用 单细胞拷贝数变异 infercnv再回首 如果下载了示例数据&#xff0c;并且你已经跑了上述代码&#xff0c;不难得到这张图&#xff1…

基于Java GUI模拟银行自动取款机

一、课题描述 编写一个程序&#xff0c;模拟银行自动取款机的工作流程。主要功能如下所述: 当输入给定的卡号和密码&#xff08;初始卡号为888888和密码为123456)时&#xff0c;系统能登录ATM柜员机系统,用户可以按照以下规则进行: 查询余额:初始余额为50000元 ATM取款:每次…

【LeetCode】每日一题 2023_11_21 美化数组的最少删除数(贪心/模拟)

文章目录 刷题前唠嗑题目&#xff1a;美化数组的最少删除数题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 原本今天早上要上体育课&#xff0c;没那么早刷每日一题的&#xff0c;本周是体测周&#xff0c;所以体育课取消了&am…

二百零七、Flume——Flume实时采集5分钟频率的Kafka数据直接写入ODS层表的HDFS文件路径下

一、目的 在离线数仓中&#xff0c;需要用Flume去采集Kafka中的数据&#xff0c;然后写入HDFS中。 由于每种数据类型的频率、数据大小、数据规模不同&#xff0c;因此每种数据的采集需要不同的Flume配置文件。玩了几天Flume&#xff0c;感觉Flume的使用难点就是配置文件 二、…