使用navigator.serial串口通信时存在固定1秒读取延迟问题
Chrome下Web Serial API读取Arduino数据固定1秒延迟问题
近期在Chrome浏览器中测试Web Serial API,实现与Arduino开发板的基础通信时,发现串口读取数据存在明显延迟,该问题仅在部分测试Demo中出现,其余Demo运行无异常。
- 无延迟表现的Demo读取数据几乎即时响应,效果如下:

- 存在异常的Demo读取数据有明显延迟(注:写入操作无延迟,键盘输入字符的瞬间即可触发写入),效果如下:

我曾对照无延迟Demo的开源源码比对自身实现逻辑,二者逻辑几乎完全一致,但自身代码运行表现和存在存在延迟的异常Demo一致。
自身核心实现代码如下:
this.port = await navigator.serial.requestPort({ filters }); await this.port.open({ baudRate: 115200, bufferSize: 255, dataBits: 8, flowControl: 'none', parity: 'none', stopBits: 1 }); this.open = true; this.monitor(); private monitor = async () => { const dataEndFlag = new Uint8Array([4, 3]); while (this.open && this.port?.readable) { this.open = true; const reader = this.port.readable.getReader(); try { let data: Uint8Array = new Uint8Array([]); while (this.open) { const { value, done } = await reader.read(); if (done) { this.open = false; break; } if (value) { data = Uint8Array.of(...data, ...value); } if (data.slice(-2).every((val, idx) => val === dataEndFlag[idx])) { const decoded = this.decoder.decode(data); this.messages.push(decoded); data = new Uint8Array([]); } } } catch { } } } public write = async (data: string) => { if (this.port?.writable) { const writer = this.port.writable.getWriter(); await writer.write(this.encoder.encode(data)); writer.releaseLock(); } }
调试过程中观测到,代码执行到await reader.read();语句时会出现短暂阻塞。
该问题可稳定复现,复现环境如下:
- 操作系统:Windows 10、macOS Monterey
- 硬件:通过USB连接的Arduino Pro Micro开发板
问题更新:经过增加详细日志的补充测试,确认每次执行写入操作到读取到返回数据的时间间隔固定为1秒,无波动。
是否有其他开发者遇到过相同问题?
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

