节点SerialPort

时间:2015-05-08 06:05:50

标签: node.js arduino-uno

我正在使用节点serialport与Arduino Uno板进行通信。以下代码是我使用过的。

serialPort.on("open", function () {
  console.log('open');
  serialPort.on('data', function(data) {
    console.log('data received: ' + data);
  });
  serialPort.write('s1\n', function(err, results) {
    if(err)
      console.log('err ' + err);
    else 
      console.log('results ' + results);
  });
});    

当我从终端(如TeraTerm或Cool Term)输入's1'时,我得到0或1。基本上,s1是读取特定传感器状态的命令。如果传感器被激活,则返回1,如果不是,则返回0.

但是,在上面的代码片段中,我得到结果为3(这是用于输入的字符串中的字符数。所以,如果我把's11 \ n'结果放在's1 \ n'上返回4.我在这里做错了什么?

永远不会触发.on('data')事件。但是,.on('open')事件触发,表示与电路板的连接正常。

1 个答案:

答案 0 :(得分:0)

写入调用是非阻塞的,结果是bytesWritten,因此您看到的值是有意义的。虽然仔细检查docs我也发现了这个非常有用的注释:

Note: Some devices like the Arduino reset when you open a connection 
to them. In these cases if you immediately write to the device they 
wont be ready to receive the data. This is often worked around by 
having the Arduino send a "ready" byte that your node program waits for 
before writing. You can also often get away with waiting around 400ms.

我可以确认这是真的。我们在发送请求之前等待来自固件的“--start--”消息。

Bonus :当Arduino重置时,注意缓冲区中的剩余垃圾。我见过像“TemperatureUpdat - start--”这样的消息。解决这个问题的2个想法:

  • 使用endsWith命令扫描“--start--”,而不是完全匹配。缺点是你不能在任何其他消息中使用“--start--”。对你发送的信息要聪明一点,这就成了一个问题。)
  • 发送一个空行,然后发送一条开始消息(例如“\ nstart \ n”)。缺点是您需要预期这两条消息(即空消息或垃圾或部分消息后跟有效的启动命令)