Update: 更新socket工作模式
This commit is contained in:
171
src/common/serial.js
Normal file
171
src/common/serial.js
Normal file
@@ -0,0 +1,171 @@
|
||||
import os from 'node:os';
|
||||
import { ChildProcess } from 'node:child_process';
|
||||
import {
|
||||
SerialPort,
|
||||
ReadlineParser,
|
||||
ByteLengthParser
|
||||
} from 'serialport';
|
||||
import EventsBase from './events-base';
|
||||
|
||||
|
||||
export default class Serial extends EventsBase {
|
||||
static {
|
||||
this.portsName = [];
|
||||
|
||||
this.getCurrentPortsName = function () {
|
||||
return this.portsName;
|
||||
}
|
||||
|
||||
this.getPorts = async function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (os.platform() === 'linux') {
|
||||
ChildProcess.exec('ls /dev/ttyACM* /dev/tty*USB*', (_, stdout, stderr) => {
|
||||
let portsName = MArray.unique(stdout.split('\n'));
|
||||
let newPorts = [];
|
||||
for (let i = 0; i < portsName.length; i++) {
|
||||
if (!portsName[i]) {
|
||||
continue;
|
||||
}
|
||||
newPorts.push({
|
||||
vendorId: 'None',
|
||||
productId: 'None',
|
||||
name: portsName[i]
|
||||
});
|
||||
}
|
||||
resolve(newPorts);
|
||||
});
|
||||
} else {
|
||||
SerialPort.list().then(ports => {
|
||||
let newPorts = [];
|
||||
for (let i = 0; i < ports.length; i++) {
|
||||
let port = ports[i];
|
||||
newPorts.push({
|
||||
vendorId: port.vendorId,
|
||||
productId: port.productId,
|
||||
name: port.path
|
||||
});
|
||||
}
|
||||
resolve(newPorts);
|
||||
}).catch(reject);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#serialport_ = null;
|
||||
#parserBytes_ = null;
|
||||
#parserLine_ = null;
|
||||
#port_ = null;
|
||||
|
||||
constructor(port) {
|
||||
this.#port_ = port;
|
||||
this.addEventsType(['buffer', 'String', 'error', 'open', 'close']);
|
||||
}
|
||||
|
||||
#addEventsListener_() {
|
||||
this.#parserBytes_.on('data', (buffer) => {
|
||||
this.runEvent('buffer', buffer);
|
||||
});
|
||||
|
||||
this.#parserLine_.on('data', (str) => {
|
||||
this.runEvent('String', str);
|
||||
});
|
||||
|
||||
this.#serialport_.on('error', (error) => {
|
||||
this.runEvent('error', error);
|
||||
});
|
||||
|
||||
this.#serialport_.on('open', () => {
|
||||
this.runEvent('open');
|
||||
});
|
||||
|
||||
this.#serialport_.on('close', () => {
|
||||
this.runEvent('close');
|
||||
});
|
||||
}
|
||||
|
||||
getPortName() {
|
||||
return this.#port_;
|
||||
}
|
||||
|
||||
async open(baud) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.#serialport_ = new SerialPort({
|
||||
path: this.getPortName(),
|
||||
baudRate: baud, // 波特率
|
||||
dataBits: 8, // 数据位
|
||||
parity: 'none', // 奇偶校验
|
||||
stopBits: 1, // 停止位
|
||||
flowControl: false,
|
||||
autoOpen: false // 不自动打开
|
||||
}, false);
|
||||
this.#parserBytes_ = this.#serialport_.pipe(new ByteLengthParser({ length: 1 }));
|
||||
this.#parserLine_ = this.#serialport_.pipe(new ReadlineParser());
|
||||
this.#serialport_.open((error) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
this.#addEventsListener_();
|
||||
});
|
||||
}
|
||||
|
||||
async close() {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.#serialport_.close((error) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async setBaudRate(baud) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.#serialport_.update({ baudRate: baud }, (error) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async send(data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.#serialport_.write(data, (error) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async setDTRAndRTS(dtr, rts) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.#serialport_.set({ dtr, rts }, (error) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
super.setDTRAndRTS(dtr, rts);
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
dispose() {
|
||||
this.disposeEvent();
|
||||
this.#serialport_ = null;
|
||||
this.#parserBytes_ = null;
|
||||
this.#parserLine_ = null;
|
||||
this.#port_ = null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user