如何从 web serial api writer 读取字节响应

How to read bytes response from web serial api writer

我正在尝试使用 Web Serial API。我想将字节写入设备并从中读取字节响应。

我可以将字节和字符串写入设备 - 这里的一切都按预期工作。 我可以从设备读取字节和字符串 - 这里我有问题。 示例显示您可以创建一个 while(true) 循环并且流将 return { value, done } 标志。但是我没有找到 done 标志的实际含义。当我连接到设备并开始这个循环时,它永远不会结束。

    while (this.port.readable) {
      try {
        while (true) {
          const { value, done } = await this.reader.read();
          if (value) {
            getChunk(value);
          }
          if (done) {
            break;
          }
        }
      } catch (error) {
        console.error("Serial port reading error: " + error);
      } finally {
        this.reader.releaseLock();
      }
    }

我确实找到了一些关于 pipeTo 函数的建议,但它只在字符串响应的示例中运行,此外它在我的情况下不起作用:

const textEncoder = new TextEncoderStream();
const writableStreamClosed = textEncoder.readable.pipeTo(this.port.writable);
const writer = textEncoder.writable.getWriter();

await writer.write("help");
Uncaught (in promise) TypeError: Failed to execute 'pipeTo' on 'ReadableStream': Cannot pipe to a locked stream

所以总结一下。如何通过串行 API 向设备写入字节并从中接收返回响应。

提前致谢。

好的,我确实编写了自己的函数来读取给定的字节数。也许这会对某人有所帮助。

public async readBytes(numberOfBytes: number): Promise<Uint8Array> {
    let bytes: Uint8Array = new Uint8Array(numberOfBytes);
    let readBytes: number = 0;
    let finished: boolean = false;

    try {
      while (true) {
        const { value, done } = await this.reader.read();
        if (value) {
          let chunk: Uint8Array = value;

          if (readBytes === 0 && chunk[0] === SerialService.FAIL) {
            return bytes;
          }

          for (let i = 0; i < chunk.length; i++) {
            bytes[i] = chunk[i];
            readBytes++;

            if (readBytes >= numberOfBytes) {
              finished = true;
            }
          }
        }
        if (done || finished) {
          break;
        }
      }
    } catch (error) {
      console.error("Serial port reading error: " + error);
    }

    return bytes;
  }