介绍
Web Serial API是一种新的范式,通过JavaScript将数据直接从USB或串行接口获取到网站/网络应用程序中!
兼容性
教程
连接您的串行设备,该设备传输串行数据(例如ESP8266)。
从用户请求访问
const port = await navigator.serial.requestPort()
此代码将打开一个弹窗,用户可以在其中为适当的设备授予许可。
请注意,这只需要执行一次,直到用户手动取消对端口的访问权限。
获取所有可用端口的列表
const ports = await navigator.serial.getPorts()
// 返回一个端口列表
从端口读取数据
async function readSerial(port) {
while (port.readable) {
const reader = port.readable.getReader();
try {
for await (const { value, done } of reader) {
if (done) {
// |reader| 已取消。
break;
}
// 使用 |value| 进行一些操作...
}
} catch (error) {
// 处理 |error|...
} finally {
reader.releaseLock();
}
}
}
额外提示
您还可以添加LineBreakTransformer,因为大多数设备会以逐行数据发出,这可以显著简化您的工作流。
// LineBreakTransformer.js
class LineBreakTransformer {
constructor() {
// 用于保存流数据的容器,直到新行到来。
this.container = "";
}
transform(chunk, controller) {
// 处理传入的块
this.container += chunk;
const lines = this.container.split("\r\n");
this.container = lines.pop();
lines.forEach((line) => controller.enqueue(line));
}
flush(controller) {
// 刷新流。
controller.enqueue(this.container);
}
}
export default LineBreakTransformer;
然后在您的代码中使用这个
const decoder = new TextDecoderStream();
port.readable.pipeTo(decoder.writable);
const inputStream = decoder.readable.pipeThrough(
new TransformStream(new LineBreakTransformer())
);
console.log(inputStream, "INPUT STREAM");
const reader = inputStream.getReader();
async function readSerial(port) {
while (port.readable) {
try {
for await (const { value, done } of reader) {
if (done) {
// |reader| 已取消。
break;
}
// 使用 |value| 进行一些操作...
}
} catch (error) {
// 处理 |error|...
} finally {
reader.releaseLock();
}
}
}
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。