js实现串口
使用Web Serial API实现串口通信
Web Serial API是现代浏览器提供的JavaScript接口,允许网页与串行设备(如Arduino、传感器等)直接通信。以下是实现步骤:
检查浏览器支持
if ('serial' in navigator) {
console.log('Web Serial API supported');
} else {
console.log('Web Serial API not supported');
}
请求串口权限并打开端口
const port = await navigator.serial.requestPort();
await port.open({ baudRate: 9600 });
配置串口参数
const writer = port.writable.getWriter();
const encoder = new TextEncoder();
await writer.write(encoder.encode('Hello World'));
writer.releaseLock();
读取串口数据
const reader = port.readable.getReader();
while (true) {
const { value, done } = await reader.read();
if (done) break;
console.log(new TextDecoder().decode(value));
}
关闭串口连接
await port.close();
使用Node.js实现串口通信
在Node.js环境中可以使用serialport库实现串口通信:
安装依赖
npm install serialport
基本使用示例
const { SerialPort } = require('serialport');
const port = new SerialPort({
path: '/dev/ttyUSB0',
baudRate: 9600
});
port.on('data', (data) => {
console.log('Received:', data.toString());
});
port.write('AT\\r\\n', (err) => {
if (err) return console.log('Error:', err.message);
});
使用解析器
const { SerialPort } = require('serialport');
const { ReadlineParser } = require('@serialport/parser-readline');
const port = new SerialPort({ path: '/dev/ttyUSB0', baudRate: 9600 });
const parser = port.pipe(new ReadlineParser({ delimiter: '\\r\\n' }));
parser.on('data', (data) => {
console.log('Received:', data);
});
浏览器兼容性解决方案
对于不支持Web Serial API的浏览器,可以考虑以下方案:
使用WebUSB API 需要设备支持USB通信协议,适用于特定硬件设备。
使用代理服务 通过WebSocket连接到后端服务,由后端处理串口通信:
const socket = new WebSocket('ws://localhost:8080/serial-proxy');
socket.onmessage = (event) => {
console.log('Received:', event.data);
};
socket.send('AT\\r\\n');
错误处理最佳实践
处理连接错误
try {
await port.open({ baudRate: 9600 });
} catch (error) {
console.error('Failed to open port:', error);
}
处理读写错误
port.on('error', (err) => {
console.error('Serial port error:', err);
});
超时处理
const timeout = setTimeout(() => {
port.close();
console.error('Connection timeout');
}, 5000);
port.on('open', () => {
clearTimeout(timeout);
});
性能优化技巧
使用缓冲区批量处理数据,减少频繁的IO操作。对于高频数据传输,考虑二进制协议而非文本协议。实现流量控制机制,防止缓冲区溢出。定期检查连接状态,实现自动重连机制。







