我一直在尝试通过 WebUSB 使用串行设备。我可以使用transferIn
和打开设备并对其进行读/写transferOut
。由于 USB 设备不会一次性发送所有数据,因此我编写了一个发送命令然后通过transferIn
递归调用读回结果的函数:
/** Send command to a device, and get its response back.
* @param {string} command
* @param {USBDevice} device
* @returns {Promise<string>}
*/
function sendCommand(command, device) {
return new Promise(function (resolve, reject) {
var pieces = [];
device.transferOut(1, new TextEncoder().encode(command + '\n')).then(function readMore() {
device.transferIn(1, 64).then(function (res) {
if (res.status !== 'ok')
reject(new Error('Failed to read result: ' + res.status));
else if (res.data.byteLength > 0) {
pieces.push(res.data);
readMore();
} else
resolve(new TextDecoder().decode(join(pieces))); // join() concatenates an array of arraybuffers
}).catch(reject);
}).catch(reject);
});
}
但是,这不起作用,因为transferIn
在解决之前等待新数据可用。如何检查 USB 串行设备是否已完成发送响应?