chrome.serial receiveTimeout不工作。

时间:2014-06-19 03:13:35

标签: google-chrome-app serial-communication

以下代码是一份包含https://github.com/GoogleChrome/chrome-app-samples/tree/master/serial/ledtoggle次要编辑内容的副本。我能够发送一个字节并收到回复。如果客户端没有发送回复,我将无法获得TimeoutError事件。我将超时设置为50毫秒。

this.receiveTimeout = 50;

以下是整个代码。

const DEVICE_PATH = 'COM1';
const serial = chrome.serial;
var ab2str = function(buf) {
  var bufView = new Uint8Array(buf);
  var encodedString = String.fromCharCode.apply(null, bufView);
  return decodeURIComponent(escape(encodedString));
};
var str2ab = function(str) {
  var encodedString = unescape((str));
  var bytes = new Uint8Array(1);
    bytes[0] = parseInt(encodedString);
}
  return bytes.buffer;
};
var SerialConnection = function() {
  this.connectionId = -1;
  this.lineBuffer = "";
  this.receiveTimeout =50;
  this.boundOnReceive = this.onReceive.bind(this);
  this.boundOnReceiveError = this.onReceiveError.bind(this);
  this.onConnect = new chrome.Event();
  this.onReadLine = new chrome.Event();
  this.onError = new chrome.Event();
};
SerialConnection.prototype.onConnectComplete = function(connectionInfo) {
  if (!connectionInfo) {
    log("Connection failed.");
    return;
  }
  this.connectionId = connectionInfo.connectionId;
  chrome.serial.onReceive.addListener(this.boundOnReceive);
  chrome.serial.onReceiveError.addListener(this.boundOnReceiveError);
  this.onConnect.dispatch();
};
SerialConnection.prototype.onReceive = function(receiveInfo) {
  if (receiveInfo.connectionId !== this.connectionId) {
    return;
  }

  this.lineBuffer += ab2str(receiveInfo.data);

  var index;
  while ((index = this.lineBuffer.indexOf('$')) >= 0) {
    var line = this.lineBuffer.substr(0, index + 1);
    this.onReadLine.dispatch(line);
    this.lineBuffer = this.lineBuffer.substr(index + 1);
  }
};
SerialConnection.prototype.onReceiveError = function(errorInfo) {
    log('Error');
 if (errorInfo.connectionId === this.connectionId) {
    log('Error');
    this.onError.dispatch(errorInfo.error);
    log('Error');
  }
    log('Error');
};
SerialConnection.prototype.connect = function(path) {
  serial.connect(path, this.onConnectComplete.bind(this))
};
SerialConnection.prototype.send = function(msg) {
  if (this.connectionId < 0) {
    throw 'Invalid connection';
  }
  serial.send(this.connectionId, str2ab(msg), function() {});
};
SerialConnection.prototype.disconnect = function() {
  if (this.connectionId < 0) {
    throw 'Invalid connection';
  }
  serial.disconnect(this.connectionId, function() {});
};
var connection = new SerialConnection();
connection.onConnect.addListener(function() {
  log('connected to: ' + DEVICE_PATH);
 );
connection.onReadLine.addListener(function(line) {
  log('read line: ' + line);
});
connection.onError.addListener(function() {
  log('Error: ');
});
connection.connect(DEVICE_PATH);

function log(msg) {
  var buffer = document.querySelector('#buffer');
  buffer.innerHTML += msg + '<br/>';
  }

document.querySelector('button').addEventListener('click', function() {
        connection.send(2);
});

1 个答案:

答案 0 :(得分:3)

也许我没有错误地阅读代码,但您没有将receiveTimeout传递给chrome.serial。方法签名为chrome.serial.connect(string path, ConnectionOptions options, function callback),其中options是可选参数。你永远不会将任何内容传递给options。解决这个问题,让我们知道会发生什么。