Electron 串口通信

这篇博客介绍如何使用Node的SerialPort库在Electron应用中实现与硬件设备(如Arduino UNO)的串口通信。内容涵盖开发环境设置、串口设备的遍历、打开关闭设备、数据发送与接收的详细步骤,并提供了源码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简介


项目名称 Node SerialPort
主页 https://serialport.io/
开源协议 MIT
github https://github.com/serialport/node-serialport
github Star 5.2k stars(2022-6-30)
github Fork 989 forks(2022-6-30)
github git地址 https://github.com/serialport/node-serialport.git

  通过一个例子来介绍一下Node的串口通信库【SerialPort】。同时也是Electron应用程序与硬件设备通过串口进行通信的例子。文末附有完整代码。本例不会涉及任何UI框架,只使用HTML、CSS、JavaScript编写代码。重点关注就是如何进行通信。

2. 开发环境

硬件:

  1. 单片机: Arduino UNO
  2. Arudino IDE版本: v 1.8.19
  3. OS: windows 10

软件:

  1. Electron版本:v19.0.4
  2. Node版本:v14.19.3
  3. npm版本:v6.14.17
  4. VS Code版本:v1.68.1
  5. SerialPort版本:v10.4.0

3. 程序说明

本例子主要有以下功能:

  1. 遍历串口设备
  2. 打开与关闭设备
  3. 向设备发送数据
  4. 接收设备发送的数据

请先看下方的程序示意图,讲解程序将根据示意图从上往下说明如何实现的。

在这里插入图片描述

先放上预加载脚本preload.js的代码,此脚本是渲染器进程与主进程IPC通信的关键。


const {
   
     contextBridge, ipcRenderer  } = require('electron')
contextBridge.exposeInMainWorld('aeIo', {
   
   
    /**
     * 获取串口设备列表
     */
    async list() {
   
    return await ipcRenderer.invoke('aeio-list') },
    /**
     * 打开串口设备
     * @param {串口地址} path 
     * @param {波特率} baudRate 
     */
    open: (path, baudRate = 9600) => {
   
    ipcRenderer.send('aeio-open', path, baudRate) },
    /**
     * 关闭设备
     */
    close:()=>{
   
   ipcRenderer.send('aeio-close')},
    /**
     * 发送数据
     * @param {向arduino发送的数据} data 
     */
    write: (data) => {
   
    ipcRenderer.send('aeio-write', data) },
    /**
     * 从arduino接收数据
     * @param {*} callback 
     */
    read: (callback) => {
   
    ipcRenderer.on('aeio-read', callback) },
    /**
     * 接收消息 这个消息内容大部分都是main.js发出的,主要是用作提示
     * @param {*} callback 
     */
    message: (callback) => {
   
    ipcRenderer.on('aeio-message', callback) },
});

3.1 遍历串口设备

  1. index.html

<div><button id="mBtnList" onclick="getList()">获取串口设备列表</button>设备列表:<span id="dListInfo"></span></div>

<script>
     /**
     * 向主进程发送获取串口设备的消息,并等待串口设备集合
     **/
     function getList() {
     
     
            window.aeIo.list().then((list) => {
     
     
                let dListInfo = document.getElementById('dListInfo');
                dListInfo.innerHTML = JSON.stringify(list);
            });
        }
</script>

  1. main.js

/**
 * 获取串口列表
 */
ipcMain.handle('aeio-list', (ev, args) => {
   
   
    return SerialPort.list().then((info, err) => {
   
   
        if (err) {
   
   
            sendToRenderer(error(`设备列表获取失败:${
     
     err}`))
            return [];
        }
        //将集合返回给界面
        return info;
    })
})

SerialPort.list()方法会返回已连接的串口设备。返回的是一个集合。返回的数据集合中,每一个代表串口设备的对象都有一个path属性,这个属性的值就是要传给打开方法。

3.2 打开与关闭设备

  1. index.html

    <div>串口设备:<input type="text" id="mInputDevPath" placeholder="请从设备列表上复制" width="200px" />波特率:<input type="text"
            id="mInputDevPort" placeholder="波特率" width="200px" value="115200" /><button id="mBtnOpen"
            onclick="openDevice()">打开设备</button><button id="mBtnClose" onclick=
### 实现Electron中的串口通信 为了在Electron中实现串口通信,`node-serialport`是一个常用的npm包[^4]。此包提供了访问计算机上的串行端口的能力,使得开发者可以通过JavaScript代码轻松地与各种硬件设备交互。 安装`node-serialport`之后,在主进程中初始化并配置串口连接参数是非常重要的一步。下面是一段展示如何设置以及打开特定波特率下的COM端口的示例代码: ```javascript const serialport = require('serialport'); const Readline = require('@serialport/parser-readline'); // 创建一个新的SerialPort实例 let port = new serialport('/dev/ttyUSB0', { baudRate: 9600, }); // 使用Readline解析器来简化接收到的数据流处理 const parser = port.pipe(new Readline({ delimiter: '\r\n' })); parser.on('data', (data) => console.log(`Received data:${data}`)); function sendData(message){ if(port.isOpen()){ port.write(`${message}\n`, function(err){ if (err) return console.error('Error on write:', err.message); console.log('Message sent successfully.'); }); } } ``` 这段脚本展示了怎样建立一个基本的串口连接,并定义了一个名为`sendData()`的功能函数用来向已连接好的串口发送消息。当有新数据到达时会触发`data`事件处理器并将接收的信息打印出来。 对于前端部分,如果是在Vue环境中工作,则可以在相应的组件里调用这些方法来进行实际操作。例如,在组件挂载完成后立即给电子秤发送一条问候语句作为测试[^1]。 此外,还有其他资源可以帮助更好地理解和实践这一过程,比如Johnny-Five.IO提供的Electron-Seralport例子项目教程[^2],它不仅涵盖了基础概念介绍,还包括完整的源码供参考学习;而文章《探索串口通信的新境界:Electron-Serialport》也给出了更多关于集成硬件到桌面应用方面的指导建议[^3]。 最后值得注意的是,随着技术的发展,Web Serial API也开始被支持于某些现代浏览器之中,这为基于网页的应用程序带来了直接操控物理设备的可能性[^5]。不过目前来说,在Electron环境下还是推荐使用`node-serialport`这样的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英杰丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值