华南理工大学无线电爱好者协会软件小组程序员

3、终于在electron中成功编译node-serialpor

2017-04-25  本文已影响4197人  谢mingmin

闲言碎语

😎
electron是一个使用Js来做桌面应用的的玩意,大名鼎鼎的vs code就是用这货做出来的。

node-serialport是一个可以用来访问电脑上串口的node.js包

Node.js package to access serial ports for reading and writing. Welcome your robotic JavaScript overlords. Better yet, program them!

作为一个只会C语言的渣渣,为了在electron上使用node-serialport折腾了我好一段时间😤。主要原因是node-serialport是一个原生库,使用的时候需要编译。而electron有自身的node.js环境,原生库在上面运行之前需要重新编译。这个编译过程会从网上下载一堆依赖,也就是因为网络原因这个过程总会失败。。。。。。

就在写这篇文章的今天,无意间百度到了解决方法😅。之前一直用 electron serialport这样的关键词,今天不知道那个抽了哪个筋,改用关键词 electron 原生模块 找到了这篇文章,里面提到了使用淘宝代理。cnpm我知道,但是万万没想到淘宝代理也有electron的镜像😂。

怎么做

本文假设你已经能使用node-serialport了,没有的话,还请移步这里。使用这个模块的时候十有八九需要重新编译的,因此需要安装node-pre-gyp,如果是Windows用户,可以看这里node-gyp installation。这个环境也有的折腾的。不是本文的重点,不提太多🙄。

node-pre-gyp建议采用全局安装,这样可以在cmd上面使用。

另外,好像npm上面的serialport有点问题,建议到GitHub上下载个源码在本地安装。

cnpm install electron --save-dev

当然可以使用cnpm install electron@1.6.2 --save-dev来指定版本,这里使用了1.6.2这个版本的electron。

安装本地的node-serialport包需要使用npm,npm install node-serialport本地路径

安装完之后,大头的工作才开始,如果顺利的话可以一次通过。先将目录定位到node-serialport。可以使用命令行cd .\\node_modules\\serialport\\
然后在使用这条命令行来编译
node-pre-gyp rebuild --target=1.6.2 --arch=x64 --target_arch=x64 --dist-url=https://npm.taobao.org/mirrors/atom-shell

最近在使用electron的时候,发现不用淘宝镜像也可以成功,建议先试一下这个,不行再换淘宝的。
node-pre-gyp rebuild --target=1.6.2 --arch=x64 --target_arch=x64 --dist-url=https://atom.io/download/electron

其中 --target=1.6.2用来指定electron的版本,--arch用两种选择ia32或者x64,--dist-url指定下载头。

强调

为了保证可以成功,先保证可以在node.js上面成功使用node-serialport!!!

这里提到了node-pre-gyp和node-gyp,两者什么区别我也不清楚。在Windows下编译原生库好像需要vs的一些东西,由于我的电脑上先前安装了vs2015。我只安装了node-pre-gyp和py2.7(py3不支持,只能用2.7),然后就可以成功编译和使用node-serialport。

这这个过程如果报错了,看看是不是有什么404。如果有十有八九是网络问题😅。

最后一步

如果你顺利的话,就来到了最后一步。激动人心的一步。

暂时没有用GitHub,只能贴代码了。

下面是package.json的内容

{
  "name": "electron_serialport",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "preinstall": "npm install .\\node-serialport-master",
    "postinstall": "cd .\\node_modules\\serialport\\ && node-pre-gyp rebuild --target=1.6.2 --arch=x64 --target_arch=x64 --dist-url=https://npm.taobao.org/mirrors/atom-shell" 
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^1.6.2"
  }
}

这里使用了脚本,可以使用npm install来安装需要的包并编译serialport包。请到GitHub上下载node-serialport-master并解压到工程文件夹下面。

接着是index.js的内容

const {app, BrowserWindow, dialog} = require('electron')

const path = require('path')
const url = require('url')

let win;

app.on('ready', () => {
    
    win = new BrowserWindow()

    win.on('close', () => {
        win = null;
    })

    win.loadURL(url.format({
        pathname: path.join(__dirname, 'index.html'),
        protocol: 'file',
        slashes: true
    }))

    win.webContents.openDevTools();
})

app.on('window-all-closed', ()=> {
    app.quit();
})

然后是count.js的内容,serialport有关的代码就在这里。

const Serialport = require('serialport');

Serialport.list((err, ports) => {
    ports.forEach((port) => {
        console.log(port.comName);
    });
});


let cnt = 0;

setInterval(() => {
    document.getElementById('cnt').textContent = cnt;
    cnt++;
}, 1000)

最后是index.html

<!doctype html>
<html>
    <head>
        <title>electron</title>
    </head>
    <body>
        <h1>
            Hello electron!
        </h1>

        <div id = "cnt"></div>
    </body>
    <script>require('./count.js')</script>
</html>

这个项目的目录结构是这样的,


目录结构

好运!!!

上一篇 下一篇

猜你喜欢

热点阅读