Google chrome - chrome.serial connection failed

2020-04-21 06:27发布

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.

enter image description here

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条回答
乱世女痞
2楼-- · 2020-04-21 07:12

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.

查看更多
登录 后发表回答