首页 > 解决方案 > 使用 Electron-Builder 的 RaspberryPi SerialPorts 出现问题

问题描述

你好大大脑互联网人,

问题:

我正在尝试为我的树莓派构建一个应用程序,但我的串行端口似乎有问题。我可以在我的主机上很好地构建和运行程序,但是当我使用 Electron-Builder 创建 appimage 时,我的目标设备似乎在使用 serialport 模块时出现问题。我认为它与使用 ARM 处理器的树莓派和我的主机桌面使用 64 位有关,但我不确定如何解决这个问题。

这是我第一个使用 nodejs/electron/html/js 的项目,所以任何帮助都将不胜感激!

主机系统:

Ubuntu 19.10

拱门:64 位

节点:v10.15.2

目标系统:

树莓派 4

树莓派 v10

拱门:Armv7l

节点:v12.15.1 - armv7 版本

错误:

/tmp/.mount_sec-trTc9j6w/resources/app.asar/node_modules/bindings/bindings.js:121 Uncaught Error: /tmp/.org.chromium.Chromium.PmaAji: wrong ELF class: ELFCLASS64
    at process.func [as dlopen] (electron/js2c/asar.js:138)
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:881)
    at Object.func [as .node] (electron/js2c/asar.js:147)
    at Module.load (internal/modules/cjs/loader.js:701)
    at tryModuleLoad (internal/modules/cjs/loader.js:633)
    at Function.Module._load (internal/modules/cjs/loader.js:625)
    at Module.require (internal/modules/cjs/loader.js:739)
    at require (internal/modules/cjs/helpers.js:14)
    at bindings (/tmp/.mount_sec-trTc9j6w/resources/app.asar/node_modules/bindings/bindings.js:112)
    at Object.<anonymous> (/tmp/.mount_sec-trTc9j6w/resources/app.asar/node_modules/@serialport/bindings/lib/linux.js:2)

包.json

{
  "name": "sec-transmitter",
  "version": "0.1.0",
  "description": "",
  "main": "main.js",
  "dependencies": {
    "modbus-serial": "^7.7.4",
    "serialport": "^7.1.5"
  },
  "build": {
    "appId": "sec.com",
    "linux": {
      "category": "Network",
      "target": {
        "target": "AppImage",
        "arch": "armv7l"
      }
    }
  },
  "devDependencies": {
    "electron": "^5.0.5",
    "electron-builder": "^22.2.0",
    "electron-rebuild": "^1.8.8"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "electron .",
    "install": "electron-rebuild",
    "dist": "electron-builder",
    "postinstall": "electron-builder install-app-deps"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

main.js

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




function createWindow() {
    //create the browser window
    let win = new BrowserWindow({
        width: 1024,
        height: 600,
        center: true,
        fullscreen: true,
        webPreferences: {
            nodeIntegration: true

        }


    })

    //and load the index html of the app
    win.loadFile('./source/index.html')
    win.webContents.openDevTools();

}

app.on('ready', createWindow)


索引.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="../assets/css/main.css">
    <script src="./index.js"></script>


</head>
<body>



    <div class="inner">
      <img class="home_button" src="../assets/images/home.png" alt="Home Button">  
        <div class="Progressbar">

            <h1>0</h1>
            <progress value="10" max="100" id="pgb1"></progress>
        </div>
    </div>
            <!--<h2>100 </h2>-->
           <!-- <h2>NO3</h2>*/-->
`          

    </div>

        <div class="Progressbar">

            <h1>0</h1>
            <progress value="32" max="100" id="pgb2"></progress>

        </div>

        <div class="Progressbar">
            <h1>0</h1>
            <progress value="56" max="100"name="pgb3"></progress>
        </div>
        <div class="Progressbar">
            <h1>0</h1>
            <progress value="80" max="100"name="pgb4"></progress>
        </div>
        <div class="Progressbar">
            <h1>0</h1>

            <progress value="100" max="100"name="pgb5"></progress>
        </div>

    </div>
<div class="Ping">
    <button id="pingBtn">Ping Device</button>
    <button id="closeBtn" onclick="quitApplication()">Exit</button>
</div>

<!--<script src="./modbus_headers.js"></script>
<script src="./modbusrtu_commands.js"></script> -->

<script src="./bgloop.js"></script> 

</body>

</html>

bgloop.js


const ModbusRTU = require('../node_modules/modbus-serial');

//create empty modbus client
const client = new ModbusRTU(

);


//open connection to serial port
client.connectRTUBuffered("/dev/ttyUSB0",
{ 
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 2,
    autoOpen: false,


});

//set timeout, if slave did not reply back
client.setTimeout(500);

//List of ID's
const IDList = [2];

const getPingDevices = async (sensors) => {
    try{
        //get response from all sensors
        for(let sensor of sensors ) {

            //output response to console
            console.log(await getPingDevice(sensor));

            //wait 100 ms before pinging another sensor
            await sleep(100);

        }
    }catch(e){
        //if error, handle them here (it should not)
        console.log(e);
    }finally{
        //close ports
        //client.close();
        // after all the data from the sensors repear again
        setImmediate(() => {
            getPingDevices(IDList)
        })
    }
}

const getPingDevice = async (device_id) => {
    try{
        //set ID of slave
        await client.setID(device_id);

        //read the ping register at address 3000
        let val = await client.readHoldingRegisters(3001,1)

        client.close();

        //return the value
        return val.data[0];
    }catch(e){
        //if error return -1
        return -1
    }
}

const sleep = (ms) => new Promise(resolve => setTimeout(resolve,ms));

//start running
getPingDevices(IDList);

标签: javascriptnode.jsraspberry-piserial-portelectron

解决方案


推荐阅读