chrome.hid.send在第二次使用时失败

时间:2014-12-03 23:18:55

标签: javascript google-chrome-app hid

关于我使用chrome.hid.send的事情似乎是让公共汽车处于不良状态。我始终无法使用API​​调用第二次使用。有时,它在第一次使用时也会失败。使用完全相同的代码,我可以回来试试一会儿(也许10分钟),第一次发送就可以了。

我正在使用的设备不会对发送给它的所有邮件返回响应。例如,测试消息只是一个被设备忽略的虚拟消息。我在Mac和PC上都测试过这个。我的调用堆栈深度在我的应用程序中此时为2(字面意思是第一个按钮单击开始,然后setTimeout在5s之后调用相同的方法。)

我测试了发送长度为64Bytes和58Bytes的缓冲区。 HidDeviceInfo对象的属性读取" maxInputReportSize":64," maxOutputReportSize":64

第一次使用的参数:

enter image description here

第二次使用的参数:

enter image description here

我真的无法确定我是如何错误地使用API​​的。当消息成功时,我可以在设备端看到它们。

// Transmits the given data
//
// @param[in] outData,       The data to send as an ArrayBuffer
// @param[in] onTxCompleted, The method called on completion of the outgoing transfer.  The return
//                           code is passed as a string.
// @param[in] onRxCompleted, The method called on completion of the incoming transfer.  The return
//                           code is passed as a string along with the response as an ArrayBuffer.
send: function(outData, onTxCompleted, onRxCompleted) {
  if (-1 === connection_) {
    console.log("Attempted to send data with no device connected.");
    return;
  }

  if (0 == outData.byteLength) {
    console.log("Attempted to send nothing.");
    return;
  }

  if (COMMS.receiving) {
    console.log("Waiting for a response to a previous message.  Aborting.");
    return;
  }

  if (COMMS.transmitting) {
    console.log("Waiting for a previous message to finish sending.  Aborting.");
    return;
  }

  COMMS.transmitting = true;
  var dummyUint8Array = new Uint8Array(outData);
  chrome.hid.send(connection_, REPORT_ID, outData, function() {
    COMMS.transmitting = false;

    if (onTxCompleted) {
      onTxCompleted(chrome.runtime.lastError ? chrome.runtime.lastError.message : '');
    }

    if (chrome.runtime.lastError) {
      console.log('Error in COMMS.send: ' + chrome.runtime.lastError.message);
      return;
    }

    // Register a response handler if one is expected
    if (onRxCompleted) {
      COMMS.receiving = true;
      chrome.hid.receive(connection_, function(reportId, inData) {
        COMMS.receiving = false;
        onRxCompleted(chrome.runtime.lastError ? chrome.runtime.lastError.message : '', inData);
      });
    }
  });
}


// Example usage
var testMessage = new Uint8Array(58);
var testTransmission = function() {
  message[0] = 123;
  COMMS.send(message.buffer, null, null);
  setTimeout(testTransmission, 5000);
};
testTranmission();

1 个答案:

答案 0 :(得分:2)

问题是Windows要求缓冲区是设备预期的完整报告大小。我已针对Chromium提交a bug以跟踪添加变通方法或至少更好的错误消息以查明问题。

通常,您可以通过使用--enable-logging --v=1命令行选项启用详细日志记录,从chrome.hid API获取更详细的错误消息。 Chrome记录的完整文档为here