当前位置: 首页 > news >正文

前端对接电子秤、扫码枪设备serialPort 串口使用教程

因为最近工作项目中用到了电子秤,需要对接电子秤设备。以前也没有对接过这种设备,当时也是一脸懵逼,脑袋空空。后来就去网上搜了一下前端怎么对接,然后就发现了SerialPort串口。

Serialport

官网地址:https://serialport.io/

Github:https://github.com/serialport/node-serialport

官方描述:使用 JavaScript 访问串行端口。Linux、OSX 和 Windows。

SerialPort是什么?

SerialPort 是一个用于在 Node.js 环境中进行串口通信的库。它允许开发者通过 JavaScript 或 TypeScript 代码与计算机上的串口设备进行交互。SerialPort 库提供了丰富的 API,使得在串口通信中能够方便地进行设置、监听和发送数据。

一般我们的设备(电子秤/扫码枪)会有一根线插入到电脑的USB口或者其他口,电脑上的这些插口就是叫串口。设备上的数据会通过这根线传输到电脑里面,比如电子秤传到电脑里的就是重量数值。那么我们前端怎么接收解析到这些数据的呢?SerialPort的作用就是用来帮我们接收设备传输过来的数据,也可以向设备发送数据。

简单概括一下:SerialPort就是我们前端和设备之间的翻译官,可以接收设备传输过来的数据,也可以向设备发送数据。

SerialPort怎么用?

SerialPort可以在Node项目中使用,也可以在Electron项目中使用,我们一般都是用在Electron项目中,接下来讲一下在Electron项目中SerialPort怎么下载和引入

1、创建Electron项目

mkdir my-electron-app && cd my-electron-app
npm init -y
npm i --save-dev electron

网上有很多Electron教程,这里不再详细说了

在package.json中看一下自己的Electron的版本,下一步会用到

2、下载SerialPort

这里先看一下自己使用的Electron对应的Node版本是什么,打开下面electron官网看表格中的Node那一列

Electron发行时间表:https://www.electronjs.org/zh/docs/latest/tutorial/electron-timelines

在这里插入图片描述

如果你Electron对应的Node版本高于v12.0.0,直接下载就行

npm install serialport

如果你Electron对应的Node版本低于或等于v12.0.0,请用对应的Node版本对应下面的serialport版本下载

https://serialport.io/docs/next/guide-platform-support#last-known-versions-for-unsupported-versions-of-nodejs

  • 对于 Node.js 版本0.100.12,最后一个正常运行的版本是serialport@4
  • 对于 Node.js 版本4.0,最后一个正常运行的版本是serialport@6.
  • 对于 Node.js 版本8.0,最后一个正常运行的版本是serialport@8.
  • 对于 Node.js 版本10.0,最后一个正常运行的版本是serialport@9.
  • 对于 Node.js 版本12.0,最后一个正常运行的版本是serialport@10.

我项目的Electron版本是11.5.0,对应的Node版本号是12.0,对应的serialport版本号是serialport@10.0.0

3、编译Serialport

  • 安装node-gyp 用于调用其他语言编写的程序(如果已安装过请忽略这一步)

    npm install -g node-gyp
    
  • 进入@serialport目录

    cd ./node_modules/@serialport/bindings
    
  • 进行编译,target后面换成当前Electron的版本号

    node-gyp rebuild --target=11.5.0
    

如果编译的时候报错了就将自己电脑的Node版本切换成当前Electron对应的版本号再编译一次

查看Electron对应Node版本号:https://www.electronjs.org/zh/docs/latest/tutorial/electron-timelines

编译成功以后就可以在代码里使用Serialport了

4、使用Serialport

serialport官网使用教程:https://serialport.io/docs/next/guide-usage

4.1、引入Serialport
const { SerialPort } = require('serialport')
// or
import { SerialPort } from 'serialport'

引入后如果启动的时候报错Cannot read property ‘indexOf’ of undefined
解决办法:解决报错Cannot read property ‘indexOf’ of undefined

4.2、创建串口(重点!)

创建串口有两种写法,新版本是这样写法new SerialPort(params, callback)

const port = new SerialPort({path: 'COM1',  // 串口号baudRate: 9600, // 波特率autoOpen: true,  // 是否自动打开端口
}, function (err) {if (err) {return console.log('打开失败: ', err.message)}console.log('打开成功')
})

旧版本是下面这样的写法new Serialport(path, params, callback),我用的是serialport@10.0.0版本就是这样的写法

const port = new Serialport('COM1', {baudRate: 9600,autoOpen: true,  // 是否自动打开端口
}, function (err) {if (err) {return console.log('打开失败: ', err.message)}console.log('打开成功')
})

创建串口的时候需要传入两个重要的参数是path和baudRate,path是串口号,baudRate是波特率。最后一个参数是回调函数

不知道怎么查看串口号和波特率看这篇文章:如何查看串口和波特率

4.3、手动打开串口

如果autoOpen参数是false,需要使用port.open()方法手动打开

const port = new SerialPort({path: 'COM1',  // 串口号baudRate: 9600, // 波特率autoOpen: false,  // 是否自动打开端口, 默认true
})
// autoOpen参数是false,需要使用port.open()方法手动打开
port.open(function (err) {if (err) {return console.log('打开失败', err.message)}console.log('打开成功')
})
4.4、接收数据(重点!)

接收到的data是一个Buffer,需要转换为字符串进行查看

port.on('data', function (data) {// 接收到的data是一个Buffer,需要转换为字符串进行查看console.log('Data:', data.toString('utf-8'))
})

接收过来的data就是设备传输过来的数据,转换后的字符串就是我们需要的数据,字符串里面可能有多个数据,我们把自己需要的数据截取出来就可以了

假设通过电子秤设备获取到的数据就是"205 000 000",中间是四个空格分割的,第一个数字205就是获取的重量,需要把这个重量截取出来。下面是我的示例代码

port.on('data', function (data) {try {// 获取的data是一个Buffer// 1.将 Buffer 转换为字符串 dataString.toString('utf-8')let weight = data.toString('utf-8')// 2.将字符串分割转换成数组,取数组的第一个值.split('    ')[0]weight = weight.split('    ')[0]// 3.将取的值 去掉前后空格weight = weight.trim()// 4.最后转换成数字,获取到的数字就是重量weight = Number(weight)console.log('获取到重量:'+ weight);} catch (err) {console.error(`重量获取报错:${err}获取到的Buffer: ${data}Buffer转换后的值:${data.toString('utf-8')}`);}
})
4.5、写入数据
port.write('Hi Mom!')
port.write(Buffer.from('Hi Mom!'))
4.6、实时获取(监听)所有串口
const { SerialPort } = require('serialport')SerialPort.list().then((ports, err) => {// 串口列表console.log('获取所有串口列表', ports);
})
更多内容

serialport官网教程:https://serialport.io/docs/next/guide-usage

参考文章:
electron-vue使用serialport串口通信及踩过的坑(已解决!)
vue-cli3+electron+serialport实现串口通信,收银系统对接电子秤

相关文章:

前端对接电子秤、扫码枪设备serialPort 串口使用教程

因为最近工作项目中用到了电子秤,需要对接电子秤设备。以前也没有对接过这种设备,当时也是一脸懵逼,脑袋空空。后来就去网上搜了一下前端怎么对接,然后就发现了SerialPort串口。 Serialport 官网地址:https://serialpo…...

LeeCode前端算法基础100题(18)整数转罗马数字

一、问题详情: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1…...

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…...

华为数通HCIA题库(750题)

完整题库在这里&#xff1a;华为数通HCIA-RS题库注释版-加水印.pdf资源-CSDN文库 此处只节选几题。 1.网络管理员在网络中捕获到了一个数据帧&#xff0c;其目的MAC地址是01-00-5E-AO-B1-C3。关于该MAC地址的说法正确的是&#xff08; )。 A.它是一个单播MAC地址 B.它是一个广播…...

SpringIOC之support模块GenericXmlApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

CCF认证+蓝桥杯习题训练

贪心 *上取整公式* *代码展示* #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 1e5 10;typedef long long LL;int v[N] , a[N];int main() {int n , d;cin >> n >> d;for(int i 1 ; i < n…...

vue前端开发自学基础,动态切换组件的显示

vue前端开发自学基础,动态切换组件的显示&#xff01;这个是需要借助于&#xff0c;一个官方提供的标签&#xff0c;名字叫【Component】-[代码demo:<component :is"ComponetShow"></component>]。 下面看看代码详情。 <template><h3>动态…...

16.桥接模式

桥接模式 介绍 桥接模式是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。这种模式通过组合的方式来实现&#xff0c;而不是继承。桥接模式通过将抽象和实现解耦&#xff0c;从而实现抽象和实现的分离&#xff0c;使得系统更加…...

【网络安全】【密码学】【北京航空航天大学】实验一、数论基础(上)【C语言和Java实现】

实验一、数论基础&#xff08;上&#xff09; 一、实验目的 1、通过本次实验&#xff0c;熟悉相关的编程环境&#xff0c;为后续的实验做好铺垫&#xff1b; 2、回顾数论学科中的重要基本算法&#xff0c;并加深对其的理解&#xff0c;为本学期密码学理论及实验课程打下良好…...

Go语言的sync.Pool如何使用?使用场景具体有哪些?

sync.Pool 是 Go 标准库中提供的一个对象池&#xff08;Object Pool&#xff09;的实现。对象池是一种用于缓存和复用对象的机制&#xff0c;可以在一定程度上减轻内存分配的开销。sync.Pool 专门用于管理临时对象&#xff0c;适用于一些需要频繁创建和销毁的短暂对象&#xff…...

MySQL单表查询练习题

一、创建表的素材 表名&#xff1a;worker——表中字段均为中文&#xff0c;比如&#xff1a;部门号、工资、职工号、参加工作等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 …...

Spring MVC中@Controller和@RestController的区别

Controller 和 RestController 是 Spring MVC 中用于处理 HTTP 请求的注解&#xff0c;它们有以下区别&#xff1a; 返回值处理方式&#xff1a; Controller 用于定义一个传统的 Spring MVC 控制器&#xff0c;它的方法通常返回视图名称或 ModelAndView 对象&#xff0c;由视图…...

Flink定制化功能开发,demo代码

前言&#xff1a; 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API&#xff0c;以kafka为数据源&#xff0c;构建一个基础测试环境&#xff1b;包含一个kafka生产者线程工具&#xff0c;一个自定义FilterFunction算子&#xff0c;一个自定义MapFunctio…...

Edge浏览器入门

关于作者&#xff1a; CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP&#xff0c;带领团队单日营收超千万。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业化变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览…...

Go语言的调度器

简介 Go语言的调度器是一个非常强大的工具&#xff0c;它可以帮助我们轻松地实现并发编程。调度器的工作原理是将多个协程映射到多个操作系统线程上&#xff0c;并根据协程的状态来决定哪个协程应该在哪个线程上运行。 调度器有两种主要策略&#xff1a; 协作式调度&#xf…...

Linux系统使用超详细(十)~vi/vim命令①

vi/vim命令有很多&#xff0c;其实只有少数的用法对于我们日常工作中起到了很大帮助&#xff0c;但是既然我选择梳理Linux的学习笔记&#xff0c;那么一定全力把自己的理解和学习笔记的内容认真整理汇总&#xff0c;内容或许有错误&#xff0c;还请发现的C友们发现了及时指出。…...

C语言实现双向链表

1.版本一 由于节点之间的连接变多 所以我们最好提前将前驱节点和后继节点用变量保存下来 以免等下在进行节点之间的指向时出错 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 节点类 typedef struct Node {// 数据域int data;// 指针域…...

OpenGL 网格拾取坐标(Qt)

文章目录 一、简介二、代码实现三、实现效果参考资料一、简介 有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就…...

GitHub高级搜索技巧

GitHub高级搜索技巧 in:name <关键字> 仓库名称带关键字查询 in:description <关键字> 仓库描述带关键字查询 in:readme <关键字> README文件带关键字查询 stars(fork): >() <数字> <关键字> star或fork数大于(或等于)指定数字的带关键字查…...

docker-compose安装HertzBeat赫兹跳动监控H3C交换机

前面我们用docker方式安装了HertzBeat&#xff0c;现在我们自己写个docker-compose.yml文件、创建文件直接docker-compose up -d直接启动运行 使用docker-compose需要先安装docker和docker-compose1、输入以下两段命令 mkdir 123 && cd 123 && mkdir data &a…...

【滤波跟踪】基于EKF的视觉-惯性里程计(VIO)与KAZE特征匹配技术,通过摄像头和IMU数据来估计无人机的位置附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。&#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f3…...

告别报错!手把手教你用Pycharm 2023.2 + Git搞定Manim社区版安装(附国内镜像源配置)

Manim社区版极速安装指南&#xff1a;PyCharm 2023.2与Git的完美协作方案 当数学可视化遇上Python开发神器PyCharm&#xff0c;Manim社区版的安装过程却常常成为新手的第一道门槛。不同于常规教程的线性步骤&#xff0c;我们将以"问题-解决"为主线&#xff0c;直击两…...

Taotoken 的 API Key 分级管理与审计日志功能在安全合规中的应用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken 的 API Key 分级管理与审计日志功能在安全合规中的应用 当企业将大模型能力集成到业务流程中时&#xff0c;除了关注模型…...

长尾关键词助力扫描SEO效果的全新方法

长尾重要词在SEO优化中扮演着重要角色&#xff0c;帮助网站吸引特定的目标用户。这些重要词通常较长且具有明确意图&#xff0c;虽然单个搜索量不高&#xff0c;但它们在低竞争环境中发光发热。依靠聚焦这些重要词&#xff0c;企业能够提高搜索排名和流量&#xff0c;进而促进转…...

OpCore Simplify:一键生成OpenCore EFI的终极解决方案

OpCore Simplify&#xff1a;一键生成OpenCore EFI的终极解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置的复杂流程头疼吗&…...

各种“地”—— 各种“GND”

GND&#xff0c;指的是电线接地端的简写。代表地线或0线。电路图上和电路板上的GND(Ground)代表地线或0线.GND就是公共端的意思&#xff0c;也可以说是地&#xff0c;但这个地并不是真正意义上的地。是出于应用而假设的一个地&#xff0c;对于电源来说&#xff0c;它就是一个电…...

纯血鸿蒙彻底告别安卓依赖:HarmonyOS 7.0 即将正式发布,国产操作系统迎来真正转折点

OpenHarmony 7.0 Beta1已经悄然上线GitCode&#xff0c;开发者体验官招募也同步启动。多数人还在讨论鸿蒙又更新了版本&#xff0c;但很少有人注意到这次更新的核心变化&#xff1a;纯血鸿蒙终于移除了对Android APK兼容层的依赖。这仅仅是一次常规版本迭代吗&#xff1f;还是国…...

博德之门3 2026最新免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)

下载链接 电子角色扮演游戏的范式革新&#xff1a;博德之门3的技术架构与玩法机制剖析 在现代电子游戏工业中&#xff0c;古典角色扮演游戏&#xff08;CRPG&#xff09;曾因其高昂的学习门槛与繁复的规则体系&#xff0c;一度被视为分众市场的垂类产品。然而&#xff0c;2023…...

ViGEmBus虚拟手柄驱动深度解析与实战指南

ViGEmBus虚拟手柄驱动深度解析与实战指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困境&#xff1a;手头有一款独特的游戏控制…...

人机协作新范式:高效论文写作全流程AI论文平台推荐(2026 最新)

2026年AI论文平台持续升级&#xff0c;论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节&#xff0c;以下工具按环节精准匹配&#xff0c;兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求&#xff0c;覆盖…...