Update: 更新socket工作模式

This commit is contained in:
王立帮
2024-11-29 21:21:58 +08:00
parent 546912edd7
commit d8ceafadbf
9 changed files with 428 additions and 0 deletions

171
src/common/serial.js Normal file
View 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;
}
}