arduino + serial + chrome + send - 无法通过串口发送数据

时间:2016-01-18 23:08:03

标签: javascript arduino serial-port google-chrome-app

我正在使用串行连接制作一个chrome打包的应用程序,以便将数据发送到arduino,但app似乎并没有向它发送数据。这就是我已经完成并想出来的事情。

我在arduino上有一个草图,如下所示:

示意图:

#define led 13  // built-in LED

int ByteReceived;

void setup()   /****** SETUP: RUNS ONCE ******/
{
  Serial.begin(9600);  
}

void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  if (Serial.available() > 0)
  {
    ByteReceived = Serial.read();

    if(ByteReceived == '1')
    {
      digitalWrite(13, HIGH);
      Serial.print(" LED ON ");
    }

    if(ByteReceived == '0')
    {
      digitalWrite(13, LOW);
      Serial.print(" LED OFF");
    }

    Serial.println();    // End the line

  }
}

当我发送" 1"它只是打开LED。到arduino并在发送" 0"时将其关闭。与Arduino IDE串行监视器完美配合。

现在让我们看一下chrome app:

的manifest.json

{
   "app": {
      "background": {
         "scripts": [ "background.js" ]
      }
   },
   "description": "No description",
   "icons": {
      "256": "icon.png"
   },

   "manifest_version": 2,
   "name": "My App",
   "permissions": [ "serial", "fullscreen" ],

   "version": "1.0"
}

和script.js,由manifest.json中的background.js加载:

var str2ab = function(str) {
   var encodedString = unescape(encodeURIComponent(str));
   var bytes = new Uint8Array(encodedString.length);
   for (var i = 0; i < encodedString.length; ++i) {
      bytes[i] = encodedString.charCodeAt(i);
   }
   return bytes.buffer;
};



var listOfSerialDevices = function(ports) {
  for (var i=0; i<ports.length; i++) {
  console.log(ports[i].path + ' ' + ports[i].vendorId + ' ' + ports[i].productId + ' ' + ports[i].displayName);
    chrome.serial.connect(ports[i].path, function (ConnectionInfo) { 
        if (ConnectionInfo) {
        console.log('id:' + ConnectionInfo.connectionId) 
        var msg = '1'
        chrome.serial.send(ConnectionInfo.connectionId, str2ab(msg), function() { console.log('Message sent!')})
    }
    } );
  }
}

chrome.serial.getDevices(listOfSerialDevices)

Console.log告诉&#34;发送消息!&#34;虽然串口显示器什么都没显此外,arduino上的TX和RX leds也不会显示来自或来自计算机的任何数据。还带领13不亮。

我还看到了两种通过chrome app连接到串行设备的解决方案,我使用了getDevices - &gt;连接 - &gt;使用Open函数而不是Connect发送但也(根本不起作用),还有chrome.serial.write而不是chrome.serial.send。如果我尝试使用写入功能控制台说,那就没有这样的功能。为什么?有两种方法可以做同样的事情吗?哪一个更好?为什么我的方法不起作用?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Chrome序列API仅定义发送功能:https://developer.chrome.com/apps/serial

发送数据时似乎有错误。传递给send函数的回调函数的调用并不自动意味着它成功。您应该检查是否有错误:

chrome.serial.send(ConnectionInfo.connectionId, str2ab(msg), function(sendInfo) {
    if (sendInfo.error) {
        console.log(sendInfo.error);
    } else if (sendInfo.bytesSent > 0) {
        console.log('Message sent!');
    }
});