如何从 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;
}
我正在尝试使用 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;
}