PC软件开发——ELECTRON串口读写、文件读取和写入 - 知乎

上一篇实现了ELECTRON serialPort库的引入和对串口进行的打开、关闭、查找的操作,本次需要解决串口数据的读写、保存文件和从文件读入的问题。

问题:

串口的数据读写操作,文件的读写操作。

解决步骤:

1、串口数据接收:在串口打开函数中,打开之后设置callback函数,on ‘data’为数据流接收方式,on ‘read’为数据阻塞在驱动层,需要主动读取,在实际通讯中,很难采用流式处理,需要进行数据分帧操作,将流数据截取为帧数据,采用timer的方式实现。

var serial_timer
ipcMain.on('open_serial',(event,arg)=>{
    console.log("open serial")
    //arg中为保存页面选择的串口参数的数组
    console.log(arg)
    //打开串口带参数
    var OpenPort = new SerialPort(arg[0],{
        baudRate: Number(arg[1]),
        dataBits: Number(arg[2]),
        parity: arg[3],
        stopBits: Number(arg[4])
    },function (err) {
        if (err) {
            console.log('open serial error: ', err.message)
            //向显示层发送打开失败信号,用于提示
            mainWindow.webContents.send('serial_open_error', err.message)
            return
        }
    })
    //监听read信号,有read时读取
    OpenPort.on('readable', function () {
        //有数据,清除分帧timer
        clearTimeout(serial_timer)
        //设置200ms timer,超时后将数据帧读出
        serial_timer = setTimeout(function (){
            //对串口数据帧进行处理
            serial_data_handle(OpenPort.read())
        }, 200);
    })
    //发送打开成功给显示进程
    mainWindow.webContents.send('serial_open_success')
})

值得一提的是:串口数据读取出来时为node特有的Buffer格式

//Buffer转ArrayBuffer
function toArrayBuffer(buf) {
    var ab = new ArrayBuffer(buf.length);
    var view = new Uint8Array(ab);
    for (var i = 0; i < buf.length; ++i) {
        view[i] = buf[i];
    }
    return ab;
}
//ArrayBuffer的编辑处理,转为DataView进行操作
var dataView = new DataView(pktBuffer);

2、串口数据发送

//转为Buffer格式,进行数据发送
var write_buffer = Buffer.from(buffer);
//直接write
OpenPort.write(write_buffer, function(err) {
    if(err) {
         console.log('err ' + err);
         //出错后返回给显示进程
         mainWindow.webContents.send('serial_write_error',err.message)
         return
    }
    console.log("write to serial ok")
});

数据发送时如果出现,发送太快,会报错误,在发送、关闭串口前应该对串口缓存进行flush

OpenPort.flush(function(err) {
    if(err) {
        console.log('flush err ' + err);
        return
    }
});

3、dialog的方式进行文件读写操作

//引入需要的包
const { dialog } = require('electron')
const fs = require("fs");

//导出文件
ipcMain.on('file_export',(event,arg)=>{
    //调用dialog的showSaveDialog
    var filePath = dialog.showSaveDialog(mainWindow, {
        title: "保存文件",
        defaultPath: "",
        //这里选择saveFile
        properties: ['saveFile'],
        filters: [
            //根据需要设置文件类型
            { name: '.txt', extensions: ['txt'] }
        ]
    }).then(result => {
        //打开选择的保存文件路径
        var fd = fs.openSync(result.filePath, 'w');
        //将数据写入文件
        fs.writeSync(fd, arg);
        //关闭文件
        fs.closeSync(fd);
        //告诉显示进程,文件写入完成
        mainWindow.webContents.send('log_export_success')
    }).catch(err => {
        console.log(err)
    })
})
//导入文件
ipcMain.on('file_import',(event,arg)=>{
    //调用showOpenDialog
    dialog.showOpenDialog({
        title: "选择导入文件",
        defaultPath: "",
        //选择openFile
        properties: ['openFile'],
        filters: [
            //设置文件类型
            { name: 'txt', extensions: ['txt'] }
        ]
    }).then(result => {
        console.log(result.filePaths[0]);
        //文本方式读取文件
        fs.readFile(result.filePaths[0], 'utf-8', (err, data) => {
            if (err) {
                console.log("An error ocurred reading the file :" + err.message)
                return
            }
            //数据发送到显示进程
            mainWindow.webContents.send('file_import_success',data)
        })
    }).catch(err => {
        console.log(err)
    })
})

有什么开发问题,欢迎留言交流


原网址: 访问
创建于: 2023-01-29 13:33:30
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论