我做了一个程序,发送数据到我的arduino,它检测发送的内容,然后根据按下的键打开正确的pin。
当使用arduino软件从我的windows电脑的arduino草图工作正常,我可以使每个引脚打开和关闭发送w a s或d。
当通过节点发送时,arduino上的RX指示灯 Flink ,但没有其他事情发生。
有人能帮忙吗?
Node.js程序:
var httpServer = require('http').createServer(function(req, response){ /* Serve your static files */ })
httpServer.listen(8080);
var nowjs = require("now");
var everyone = nowjs.initialize(httpServer);
everyone.now.logStuff = function(msg){
console.log(msg);
}
var SerialPort = require('serialport2').SerialPort;
var assert = require('assert');
var portName;
if (process.platform == 'win32') {
portName = 'COM4';
} else if (process.platform == 'darwin') {
portName = '/dev/cu.usbserial-A800eFN5';
} else {
portName = '/dev/ttyUSB0';
}
var readData = '';
var sp = new SerialPort();
sp.on('close', function (err) {
console.log('port closed');
});
sp.on('error', function (err) {
console.error("error", err);
});
sp.on('open', function () {
console.log('port opened... Press reset on the Arduino.');
});
sp.open(portName, {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false
});
everyone.now.forward = function() {
sp.write("w");
}
everyone.now.back = function() {
sp.write("s");
}
everyone.now.left = function() {
sp.write("a");
}
everyone.now.right = function() {
sp.write("d");
}
sp.on('data', function(data) {
console.log(data.toString());
});
Arduino项目:
void setup(){
Serial.begin(9600);
Serial.write("READY");
//Set all the pins we need to output pins
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop (){
if (Serial.available() > 0) {
//read serial as a character
char ser = Serial.read();
Serial.write(ser);
//NOTE because the serial is read as "char" and not "int", the read value must be compared to character numbers
//hence the quotes around the numbers in the case statement
switch (ser) {
case 'w':
move(8);
break;
case 's':
move(9);
break;
case 'a':
move(10);
break;
case 'q':
move(10);
move(8);
break;
case 'd':
move(11);
break;
case 'e':
move(11);
move(8);
break;
}
}
}
void move(int pin){
Serial.print(pin);
digitalWrite(pin, HIGH);
delay(1);
digitalWrite(pin, LOW);
}
4条答案
按热度按时间ntjbwcob1#
我最近涉足了这个领域,当Arduino从除Arduino IDE之外的大多数东西接收串行通信时,它会自动重置,这就是为什么你可以从IDE发送,但不能从node.js发送。
我有一个Uno,并在复位和接地之间放置了一个电容器。这里有一个关于这个主题的好信息页面。
祝你好运
l7mqbcuq2#
我每天都使用Node通过USB或BT向我的Arduino发送动作,在这两种情况下都能很好地工作。我认为你的问题来自于发送信件,你应该改为发送一个缓冲区,带有信件的ASCII值,就像这样:
同样,对于这一点,我认为你会更好地与一些“逻辑”接口,与数据头,动作的数量,诸如此类的东西。2这不是你的要求,但它会使你的代码更健壮,更容易修改在未来。
下面是我如何做的一个例子。首先,节点:
然后你像以前那样叫他们:
这样就很容易在Arduino上Serial.read()数据:(注意,您需要在某处定义数据页眉和数据页脚)
我希望我说清楚了,希望能有所帮助!干杯!
6tr1vspr3#
关于电容器和复位问题...在较新型号的Arduino上,其中一条串行控制线和复位线之间有一个小电容器。该电容器会导致Arduino在端口打开时复位,但不会干扰正常的串行操作。
这个重置技巧允许代码上传重置Arduino作为上传过程的一部分。当Arduino启动时,在加载的代码运行之前,代码 Boot 加载程序会先运行一小段时间。
上传过程为:重置启动 Boot 加载程序的Arduino,在Arduino IDE中启动上传过程,建立通信,上传,然后运行加载的代码。当Arduino启动时,它会等待上传一段时间,如果没有收到上传,它会继续运行代码。
我发现这个非常有用,因为它允许我们通过关闭和打开端口来有效地重置Arduino。在旧的Arduino中,没有这个电容器,你必须在正确的时间按下重置按钮来上传代码。时间是这样的,Arduino在开始上传代码之前花了更多的时间等待。
在这里描述的问题中,我不相信他会因为使用了重置技巧而遇到任何麻烦。当他打开串行端口时,它应该只会重置Arduino,从他的信息来看,这是一个预期的副作用。
gk7wooem4#
在我的情况下,问题是重置,但串行端口是打开的-但在重置完成之前无法写入。在写入端口之前放置3s延迟修复了这个问题。写入ASCII不是问题。