javascript - 使用 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);
解决方案
推荐阅读
- vba - Access DB - 在一个字段中保存文件位置(完整)链接/路径,在另一个字段中保存文件名(两者或其中一个都应可单击以打开文件)
- unity3d - 如何访问附加到预制件的孩子的对撞机?
- javascript - 嵌套模式的猫鼬查询
- spring - 不同的Springboot服务使用同一张表
- tensorflow - 了解 Time2Vec 嵌入以将其实现为 keras 层
- logstash - Logstash 将哈希逐行写入 csv
- android - 动态更改 Fragment 内的 ImageView - 或动态生成 Fragment?
- python - Databricks API 2.0 - 创建秘密范围 - TEMPORARILY_UNAVAILABLE
- tensorflow - Keras 标记器:将数字保留为“单词”
- python - 如何使用 PIL 绘制具有渐变色的字符?