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" 消息。
我在我的 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" 消息。