Mac OS X High Sierra - Arduino 与 NodeJs 的通信仅在调试中使用断点写入

Mac OS X High Sierra - Arduino communication with NodeJs works only in debug with break point on write

我在我的 Mac 上用 NodeJs 运行 尝试了一个简单的演示,它想从连接到串行端口的 Arduino 发送和接收数据。

我使用了 serialport npm 的包。

这是 NodeJs 代码。

var SerialPort = require('serialport');

var portName = "/dev/cu.usbmodem1421";

var myPort = new SerialPort(portName, 9600);

var Readline = SerialPort.parsers.Readline;
var parser = new Readline();
myPort.pipe(parser);

myPort.on('open', showPortOpen);
parser.on('data', readSerialData);
myPort.on('close', showPortClose);
myPort.on('error', showError);

function showPortOpen() {
    console.log('port open. Data rate: ' + myPort.baudRate);
    myPort.write(':FF0807#');

}

function readSerialData(data) {
    console.log(data);
}

function showPortClose() {
    console.log('port closed.');
}

function showError(error) {
    console.log('Serial port error: ' + error);
}

这是 Arduino 代码。

String readString;

void setup() {

  Serial.begin(9600);

}

void loop() {

  while (Serial.available()) {
    delay(3);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
    } 
  }

  if(readString == ":FF0807#") {
    Serial.println("received!");
    delay(100);

  }
  readString = "";

}

如您所见,NodeJs 脚本打开串口通信,打开时,它会在上面写入字符串 :FF0807#

另一边的 Arduino 读取字符串并用 received! 字符串进行响应。

我的 NodeJs 脚本仅在调试时有效,并且仅当我在将数据发送到 Arduino 的行上放置断点时才有效。

我试过在发送数据之前设置一些超时,但这也不起作用。

谁能帮帮我?

谢谢!!

我解决了这个问题。包文档中显示的超时 (400ms) 不足以让 Arduino Uno 有时间初始化串行。在我发布问题之前,我还尝试了 1 秒的超时,但这还不够。

一切正常,超时为 3/5 秒。我个人更喜欢官方文档中描述的第二种方式,即在发送第一个命令之前等待 Arduino 发送的 "ready" 消息。