前端对接电子秤、扫码枪设备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.10和0.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、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义: 标准函数: 输入 n 对整数的 a、b ,输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…...
华为数通HCIA题库(750题)
完整题库在这里:华为数通HCIA-RS题库注释版-加水印.pdf资源-CSDN文库 此处只节选几题。 1.网络管理员在网络中捕获到了一个数据帧,其目的MAC地址是01-00-5E-AO-B1-C3。关于该MAC地址的说法正确的是( )。 A.它是一个单播MAC地址 B.它是一个广播…...
SpringIOC之support模块GenericXmlApplicationContext
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
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前端开发自学基础,动态切换组件的显示!这个是需要借助于,一个官方提供的标签,名字叫【Component】-[代码demo:<component :is"ComponetShow"></component>]。 下面看看代码详情。 <template><h3>动态…...
16.桥接模式
桥接模式 介绍 桥接模式是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合的方式来实现,而不是继承。桥接模式通过将抽象和实现解耦,从而实现抽象和实现的分离,使得系统更加…...
【网络安全】【密码学】【北京航空航天大学】实验一、数论基础(上)【C语言和Java实现】
实验一、数论基础(上) 一、实验目的 1、通过本次实验,熟悉相关的编程环境,为后续的实验做好铺垫; 2、回顾数论学科中的重要基本算法,并加深对其的理解,为本学期密码学理论及实验课程打下良好…...
Go语言的sync.Pool如何使用?使用场景具体有哪些?
sync.Pool 是 Go 标准库中提供的一个对象池(Object Pool)的实现。对象池是一种用于缓存和复用对象的机制,可以在一定程度上减轻内存分配的开销。sync.Pool 专门用于管理临时对象,适用于一些需要频繁创建和销毁的短暂对象ÿ…...
MySQL单表查询练习题
一、创建表的素材 表名:worker——表中字段均为中文,比如:部门号、工资、职工号、参加工作等 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 请求的注解,它们有以下区别: 返回值处理方式: Controller 用于定义一个传统的 Spring MVC 控制器,它的方法通常返回视图名称或 ModelAndView 对象,由视图…...
Flink定制化功能开发,demo代码
前言: 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API,以kafka为数据源,构建一个基础测试环境;包含一个kafka生产者线程工具,一个自定义FilterFunction算子,一个自定义MapFunctio…...
Edge浏览器入门
关于作者: CSDN内容合伙人、技术专家, 从零开始做日活千万级APP,带领团队单日营收超千万。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业化变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览…...
Go语言的调度器
简介 Go语言的调度器是一个非常强大的工具,它可以帮助我们轻松地实现并发编程。调度器的工作原理是将多个协程映射到多个操作系统线程上,并根据协程的状态来决定哪个协程应该在哪个线程上运行。 调度器有两种主要策略: 协作式调度…...
Linux系统使用超详细(十)~vi/vim命令①
vi/vim命令有很多,其实只有少数的用法对于我们日常工作中起到了很大帮助,但是既然我选择梳理Linux的学习笔记,那么一定全力把自己的理解和学习笔记的内容认真整理汇总,内容或许有错误,还请发现的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,现在我们自己写个docker-compose.yml文件、创建文件直接docker-compose up -d直接启动运行 使用docker-compose需要先安装docker和docker-compose1、输入以下两段命令 mkdir 123 && cd 123 && mkdir data &a…...
【滤波跟踪】基于EKF的视觉-惯性里程计(VIO)与KAZE特征匹配技术,通过摄像头和IMU数据来估计无人机的位置附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 dz…...
告别报错!手把手教你用Pycharm 2023.2 + Git搞定Manim社区版安装(附国内镜像源配置)
Manim社区版极速安装指南:PyCharm 2023.2与Git的完美协作方案 当数学可视化遇上Python开发神器PyCharm,Manim社区版的安装过程却常常成为新手的第一道门槛。不同于常规教程的线性步骤,我们将以"问题-解决"为主线,直击两…...
Taotoken 的 API Key 分级管理与审计日志功能在安全合规中的应用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 的 API Key 分级管理与审计日志功能在安全合规中的应用 当企业将大模型能力集成到业务流程中时,除了关注模型…...
长尾关键词助力扫描SEO效果的全新方法
长尾重要词在SEO优化中扮演着重要角色,帮助网站吸引特定的目标用户。这些重要词通常较长且具有明确意图,虽然单个搜索量不高,但它们在低竞争环境中发光发热。依靠聚焦这些重要词,企业能够提高搜索排名和流量,进而促进转…...
OpCore Simplify:一键生成OpenCore EFI的终极解决方案
OpCore Simplify:一键生成OpenCore EFI的终极解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置的复杂流程头疼吗&…...
各种“地”—— 各种“GND”
GND,指的是电线接地端的简写。代表地线或0线。电路图上和电路板上的GND(Ground)代表地线或0线.GND就是公共端的意思,也可以说是地,但这个地并不是真正意义上的地。是出于应用而假设的一个地,对于电源来说,它就是一个电…...
纯血鸿蒙彻底告别安卓依赖:HarmonyOS 7.0 即将正式发布,国产操作系统迎来真正转折点
OpenHarmony 7.0 Beta1已经悄然上线GitCode,开发者体验官招募也同步启动。多数人还在讨论鸿蒙又更新了版本,但很少有人注意到这次更新的核心变化:纯血鸿蒙终于移除了对Android APK兼容层的依赖。这仅仅是一次常规版本迭代吗?还是国…...
博德之门3 2026最新免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)
下载链接 电子角色扮演游戏的范式革新:博德之门3的技术架构与玩法机制剖析 在现代电子游戏工业中,古典角色扮演游戏(CRPG)曾因其高昂的学习门槛与繁复的规则体系,一度被视为分众市场的垂类产品。然而,2023…...
ViGEmBus虚拟手柄驱动深度解析与实战指南
ViGEmBus虚拟手柄驱动深度解析与实战指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困境:手头有一款独特的游戏控制…...
人机协作新范式:高效论文写作全流程AI论文平台推荐(2026 最新)
2026年AI论文平台持续升级,论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节,以下工具按环节精准匹配,兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求,覆盖…...
