首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebSerial API 完整介绍

WebSerial API 完整介绍

原创
作者头像
泽霖
发布2023-11-11 23:49:40
发布2023-11-11 23:49:40
2.5K10
代码可运行
举报
文章被收录于专栏:分享技术分享技术
运行总次数:0
代码可运行

介绍

Web Serial API是一种新的范式,通过JavaScript将数据直接从USB或串行接口获取到网站/网络应用程序中!

兼容性

教程

连接您的串行设备,该设备传输串行数据(例如ESP8266)。

从用户请求访问

代码语言:javascript
代码运行次数:0
运行
复制
const port = await navigator.serial.requestPort()

此代码将打开一个弹窗,用户可以在其中为适当的设备授予许可。

请注意,这只需要执行一次,直到用户手动取消对端口的访问权限。

获取所有可用端口的列表

代码语言:javascript
代码运行次数:0
运行
复制
const ports =  await navigator.serial.getPorts()
// 返回一个端口列表

从端口读取数据

代码语言:javascript
代码运行次数:0
运行
复制
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,因为大多数设备会以逐行数据发出,这可以显著简化您的工作流。

代码语言:javascript
代码运行次数:0
运行
复制
// 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;

然后在您的代码中使用这个

代码语言:javascript
代码运行次数:0
运行
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档