注意:
不同厂家的扫码枪开启串口数据模式可能不一样,具体联系厂家开启其串口通讯;
在electron环境下,新开一个子窗口用于监听扫码枪窗口程序,具体代码如下
创建qrCode.html
在配置文件 main.js
下
// mainWindow.on('closed', function () {
// qrCodeWindow.close();
// mainWindow = null;
//qrCodeWindow=null
// })
app.on('ready', ()=>{
createWindow();
qrCode();
})
app.on('activate', function () {
// macOS中点击Dock图标时没有已打开的其余应用窗口时,则通常在应用中重建一个窗口
if (mainWindow === null) {
createWindow()
qrCode()
}
})
function qrCode(){
qrCodeWindow = new BrowserWindow({
title: '二维码串口数据捕获',
show: false,
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true, //开启渲染进程中调用模块 即require
}
})
qrCodeWindow.loadFile('./build/qrCode/qrCode.html');//子窗口路径
ipcMain.on('qrBegin', (event, obj) => {//监听开始
qrCodeWindow.webContents.send('begin', obj);
})
ipcMain.on('qrStart', (event, obj) => { //监听的结果返回
mainWindow.send('qrResult',obj)
})
}
qrCode.html如下
const { ipcRenderer } = require('electron');
var serialPort = require("serialport");
var SerialPort = serialPort.SerialPort;
serialPort.list(function (err, ports) {
ports.forEach(function (port) {
begin(port.comName)
});
function begin(port) {
var comName = port;
var port = new serialPort(comName, {
baudRate:9600, //波特率
autoOpen: false,
dataBits: 8, //数据位
parity: 'none', //奇偶校验
stopBits: 1, //停止位
flowControl: false
});
port.open(function (error) {
if (error) return;
//所有数据发送到串口时
port.drain(function (error) {
if (!error) {
port.on('data', function (data) {
let obj ={};
console.log(data)
obj.code = Uint8ArrayToString(data)
ipcRenderer.send('qrStart',obj)//发送到主程序,在需要用到的地方做监听即可。
});
}
})
})
}
//uni8转字符串
function Uint8ArrayToString(fileData) {
var dataString = "";
for (var i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i]);
}
return dataString;
}
使用的地方代码如下
const { ipcRenderer } = require('electron');
ipcRenderer.send('qrBegin'); //监听开始 ,在整个程序中此处只需要执行一次
ipcRenderer.removeAllListeners('qrResult') //先移除监听,避免多次进当前页面导致重复监听
ipcRenderer.on('qrResult',(e,code)=>{
console.log(code) //获得扫码枪串口发送过来的数据
})