Chrome Web Serial API ->{value,done} -> done在阅读了串口设备发送的全部数据后仍不为真

bn31dyow  于 2023-11-14  发布在  Go
关注(0)|答案(2)|浏览(199)

const { value,done } = await reader.read();
在文档中使用了上面的一行(https://web.dev/serial/)来读取来自串行端口的数据。如果说done将在串行设备发送的所有数据都被读取时变为true。但它不会变为true,因为它在while循环中,我的代码在这一行卡住了,进一步等待所述串行设备发送新数据,即使所述串行设备已经发送了所有数据。
(我使用的是Chrome浏览器,Windows,代码是用js文件写的)

gdrx4gfi

gdrx4gfi1#

我找到了一个解决办法。我所做的是每当ReceivedData更新为'\u0004\u0003'字符串时,这意味着串行设备已经完成了数据传输,因为'\u0004\u0003'意味着EOTETX(传输结束,文本结束)。至少在我的情况下,它工作了,因为我知道串行设备在STX和EOTETX中 Package 它的实际消息的方式。
参考下面的代码,对我所说的有一个正确的想法。我是这样写的:

while (port && port.readable){
    const { value, done } = await reader.read();
        if (done) {
            break;
        }
        // value is a string.
        ReceivedData +=value;
        if(ReceivedData.includes('\u0004\u0003')){
            break;
        }
}

字符串

i7uaboj4

i7uaboj42#

我在文档中读到了同样的信息,也很困惑。我只是在调用reader.cancel()后才观察到done=true。也许文档应该澄清一下。
在cancel之后需要它来跳出while循环。
你可以在我的https://webserial.io源代码中看到它:
https://github.com/williamkapke/webserial/blob/8ae91a2fd978eede59182c2a4b28725c12c932a8/src/stores/connection.js#L107

相关问题