Node.js SerialPort Arduino时序问题

我试图让我的Raspberry Pi / Node.js使用node-serialport与Arduino Uno进行通信。 我遇到了以下代码块的问题:

树莓派

var SerialPort = require("serialport").SerialPort; var serialPort = new SerialPort("/dev/ttyACM0", { baudrate: 9600 }); serialPort.on("open", function () { console.log('open'); serialPort.on('data', function(data) { console.log('data received: ' + data); }); serialPort.write(new Buffer('4','ascii'), function(err, results) { console.log('err ' + err); console.log('results ' + results); }); }); 

Arduino的

 // LED on pin 12 int led = 12; // Incoming serial data int data=0; void setup() { // Pin 12 set to OUTPUT pinMode(led, OUTPUT); // Start listening on the serialport Serial.begin(9600); } void loop() { if(Serial.available()>0){ // Read from serialport data = Serial.read(); // Check and see if data received == 4 if(data=='4') { // Blink the LED 3 times for(int i=0;i<3;i++){ digitalWrite(led, HIGH); delay(1000); digitalWrite(led,LOW); delay(1000); } // Reset data to 0 data=0; } } } 

我只能得到Arduino闪烁的LED,如果我围绕serialPort.write()函数for循环。 在第40次循环迭代时,LED终于开始闪烁,并将继续闪烁,直到serialPort.write()循环结束。 这使我相信我遇到了某种时机问题。 我正在寻找一个更加优雅的(和非阻塞)解决scheme来通过Pi闪烁Arduino上的LED。 任何帮助将不胜感激。

谢谢! 鲍比

       

网上收集的解决方案 "Node.js SerialPort Arduino时序问题"

这个问题与Arduino的“AutoReset”有关。

我没有真正禁用autoreset …我继续前进,并实施了我上面张贴的代码。 我需要用户交互来触发SerialPort.write()。 只要在串行连接打开和第一次写入之间有几秒钟的时间,这就可以工作。

我的猜测是new Buffer('4','ascii')正在做一个ASCIIstring,而不是一个ASCII字符。 不同的是,你不发送4 ,或44444444…使用你的循环,但4\04\04\04\04\04\04\04\0…使用你的循环。

所以当你做Serial.available() ,它返回2,因为它得到了两个字节的缓冲,但你只能读一个字节。 由于Arduino的缓冲区是一个循环的缓冲区,随着时间的推移会被新的数据覆盖,可能发生的事情是,你只能读取\0 s,直到时间推移,你只能读取4秒。

我的build议是读取尽可能多的字符,或者只是放弃无效的读取,因为Serial.read()在缓冲区为空时返回-1

 const int led=12; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { // Read from serialport int data = Serial.read(); // Check and see if data received == 4 // and thus discard data==-1 or data==`\0` if(data=='4') { // Blink the LED 3 times for(int i=0;i<3;i++){ digitalWrite(led, HIGH); delay(1000); digitalWrite(led,LOW); delay(1000); } } }