我正在使用节点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')事件触发,表示与电路板的连接正常。
答案 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个想法: