앙큼한 개발기록

[electron] electron-nuxt serialport 연결 본문

개발/electron

[electron] electron-nuxt serialport 연결

angkeum 2022. 6. 21. 22:09

최근 electron으로 개발하면서 

가장 오래동안 애먹고 

가장 힘들었고

다 영어로 되어 있어서 짜증났던 내용을 정리하고자 한다. 

 

우선 serial-port

나는 node version이 14.x.x이였나...?를 사용해서 그런지 최신 버전의 serial-port (내가 할때는 10.x 가 최신)를 설치하면 

버전 오류 및 build 오류를 마구 던졌다. 

그래서 9.2.0 버전을 기준으로 

이글을 작성한다. 

 

설치는 

yarn add serial-port

electron에서 serial-port는 브라우저단에서는 사용이 불가능하고 

앱 단에서 사용이 가능하다. 

 

시리얼 포트를 사용하면서 느끼는 건데 javascript는 single thread 이고 나는 비동기 콜백을 포트에 사용해서 

포트와 데이터를 주고 받고 전달하는거 다 기다리고 싶으면 

SerailPort.js를 별도로 만들어서 

아래의 코드로 사용하면 좋다. 

 

'use strict'

const SerialPort = require('serialport')

// write async
SerialPort.prototype.writeAsync = function (data, encoding) {
    return new Promise((resolve, reject) => {
        try {
            this.write(data, encoding, (err) => {
                if (err)
                    resolve(err)
                else
                    resolve(null)
            })
        }
        catch (e) {
            reject(e)
        }
    })
}

// close async
SerialPort.prototype.closeAsync = function () {
    return new Promise((resolve, reject) => {
        try {
            this.close((err) => {
                if (err)
                    resolve(err)
                else
                    resolve(null)
            }, null)
        } catch (e) {
            reject(e)
        }
    })
}

module.exports = SerialPort


// 이런식으로 정의하고
const SerailPort = require('./SerialPort')

포트는 아래처럼 사용하면 된다. 

const SerailPort = require('./SerailPort')

let port = 'COM1'
let baudRate = 9600

let port = new SerialPort(port, {
    baudRate: baudRate
})

// 포트 열기
port.on('open', async () => {
    await port.writeAsync('포트로 보내고 싶은 내용')

	// 호출시 port.on close 호출
	await port.closeAsync()
})

// 포트 오류
port.on('error', async (e) => {
    console.log('[message] error', e)
})

// 포트 닫고 나서 호출
port.on('close', e => {
    console.log('[message] close', e)
})

new Serialport로 생성할때 사용되는 포트 목록은 

아래의 코드에서 목록을 보고 

포트 목록을 알 수 있다. 

그리고 호출은 비동기다.

    portList: async () => {
        return await SerialPort.list()
            .catch(e => {
                console.log('[port list]', e)
                return []
            })
    },

baudRate는 전송 속도를 말하는데 

연결되어 있는 기기에 따라서 다를수 있다. 

기본적으로 9600으로 되어 있는 기기가 많다. 

확인하려면 [window] - [장치 관리자] 에서 연결된 포트 상세정보를 보면 알수 있다. 

 

끝.

Comments