简体   繁体   English

Google Chrome-chrome.serial连接失败

[英]Google chrome - chrome.serial connection failed

I am trying to connect to USB serial which is working manually as below: 我正在尝试连接到如下所示的手动工作的USB串口:

$ 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: 应用程序,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);

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. 通过OSX上的USB访问,发现Chrome无法访问USB设备,直到运行本机客户端应用程序(使用hidapi)并识别该设备。

Use Windows OS with same code, then it works. 使用具有相同代码的Windows操作系统,即可正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM