为啥 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行?
Posted
技术标签:
【中文标题】为啥 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行?【英文标题】:Why might a Web Serial API app work in Windows and Linux but not macOS?为什么 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行? 【发布时间】:2021-02-13 11:27:54 【问题描述】:我正在尝试开发一个网页,该网页可以与连接到计算机 USB 端口的 STM Nucleo 板通信。 Nucleo 板通过 USB 使用串行端口连接进行通信,我可以使用串行终端程序(在我的例子中为 CoolTerm)愉快地与它交谈。浏览器应用程序在 Windows 和 Linux 中运行良好,但在 macOS 中则不行。 macOS 报告串行连接可用,似乎连接并正确打开端口,并开始工作,但在发送几十个字节后,mac 中的串行端口似乎冻结,并且不再向 Nucleo 传输任何内容木板。 Web 串行应用程序在发送器停止发送数据之前和之后报告所有标志(CTS、DCD、DSR 和 RI)为假,但打开端口时 flowControl 设置为默认值“none”)。
有谁知道为什么会发生这种情况以及如何让 mac 串行端口传输超过几十个字节?
(我在尝试使用 python 和 pyserial 时观察到完全相同的行为:它适用于 Windows 和 Linux,但不适用于 macOS,所以我假设这与 macOS 串行端口有关。)
打开端口并发送数据的代码如下所示:
async function _serialNewClickConnect()
// Select the serial port. Note: can add filters here, see web.dev/serial
_serialPort = await navigator.serial.requestPort();
// Open the serial port.
await _serialPort.open( baudRate: 115200, bufferSize: 64 );
// Set up to allow data to be written:
_serialWriter = _serialPort.writable.getWriter();
// Listen to data coming from the serial device.
while (_serialPort.readable)
_serialReader = _serialPort.readable.getReader();
try
while (true)
const value, done = await _serialReader.read();
if (done)
// To allow the serial port to be closed later:
_serialReader.releaseLock();
break;
if (value)
// Something has arrived. This will be stored in value as a uint8 array.
for (let x = 0; x < value.byteLength; x++)
_serialRxData.push(value[x]);
catch (error)
// TODO: Handle non-fatal read error.
async function sendString(string)
// Sends a string over the serial port.
const data = new TextEncoder().encode(string);
await _serialWriter.write(data);
【问题讨论】:
【参考方案1】:非常感谢一位同事(他的工作没有 Stack Overflow 帐户来获得奖励),我找到了一个(部分)答案:“因为 Nucleo 板的固件中存在错误” .
将 Nucleo 板上的固件更新到最新版本解决了该问题。为什么旧固件可以在 macOS 上与 Windows、Linux 和 Coolterm 一起使用,但不能在 macOS 上与 python 脚本或 Web Serial API 一起使用,我可能永远也不会知道。但我很想知道整个故事。如果有人了解更多信息,请发表回复/评论。
【讨论】:
以上是关于为啥 Web Serial API 应用程序可以在 Windows 和 Linux 中运行,但不能在 macOS 中运行?的主要内容,如果未能解决你的问题,请参考以下文章
Vue3项目(Vite+TS)使用Web Serial Api全记录
Google Chrome Web Serial API:如何使用十六进制代码寻址 Modbus 设备?
什么是“必须处理用户手势才能显示权限请求”。 Chrome Web Serial API 中的错误消息?
Google Chrome Web Serial API:如何配置 Modbus RTU 的参数?