-->

Google chrome - chrome.serial connection failed

2020-04-21 06:31发布

问题:

I am trying to connect to USB serial which is working manually as below:

$ ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.usbserial
$ screen /dev/cu.usbserial 9600

But when Google chrome apps trying to connect its failing.

apps, background.js:

var DEVICE_PATH = '/dev/cu.usbserial';
var serial = chrome.serial;

function log(msg) {
  console.log(msg);
}

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;
};

// Object
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, {bitrate: 9600}, 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() {});
};

// -- Connect
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);

回答1:

USB access on OSX, found that Chrome does not gain access to the USB device until the native client application (using hidapi) is running and recognize the device.

Use Windows OS with same code, then it works.