串口不工作?

我做了一个程序,发送数据到我的arduino,它检测发送了什么,然后打开正确的引脚根据什么键被按下。

当从我的Windows电脑使用arduino软件arduino草图工作正常,我可以使每个引脚打开和closures通过发送WAS或D.

当通过节点发送时,arduino上的RX灯闪烁,但没有其他事情发生。

谁能帮忙?

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); } 

我最近涉猎了这个。 Arduino从Arduino IDE以外的大多数地方接收串行通信时会自动复位。 这就是为什么你可以从IDE发送而不是node.js.

我有一个Uno,并在Reset和Ground之间放置了一个电容。这里有一个关于这个主题的好消息。
祝你好运。 http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

关于电容器和复位问题…在一个串行控制线之间有一个小电容器,在后面的型号中的Arduino上复位。 这个电容会导致Arduino在端口打开时复位,否则不会干扰正常的串行操作。

这个重置技巧允许代码上传重置Arduino作为上传过程的一部分。 当Arduino启动时,引导加载程序在加载的代码运行之前先运行一小段时间。

上传过程是:重启启动启动加载器的Arduino,在Arduino IDE中启动上传过程,build立通信,上传,然后运行加载的代码。 当Arduino启动时,如果没有收到,就等待上传一段时间,然后继续运行代码。

我觉得这非常有用,因为它使我们能够通过closures和打开端口来有效地重置Arduino。 在旧的Arduino中,如果没有这个电容器,你必须在正确的时间按下重置button来获得代码上传。 而且时间是这样的,Arduino花了更多的时间在上传的代码开始之前等待。

在这里所描述的问题中,我不相信他因为使用重置技巧而有任何麻烦。 当他打开串口时,应该只有重置Arduino的效果,从他的信息看,这是一个理想的副作用。

我每天使用节点通过USB或者通过bt发送动作到我的Arduino,并且在两种情况下都很好。 我认为你的问题来自发送信件。 你应该发送一个缓冲区,而不是字母的ascii值,就像这样:

 myPort.write(Buffer([myValueToBeSent])); 

另外,对于这一点,我想你会更好的一些“逻辑”接口,数据头,行动的数量,这样的东西。 这不是你所需要的,但它会使你的代码更健壮,更容易修改。

这是我如何做的一个例子。 首先,Node:

 var dataHeader = 0x0f, //beginning of the data stream, very useful if you intend to send a batch of actions myFirstAction = 0x01, mySecondAction = 0x02, myThirdAction = 0x03; 

你然后像你一样打电话给他们:

 everyone.now.MyBatchOfActions = function() { sp.write(Buffer([dataHeader])); sp.write(Buffer([0x03])); // this is the number of actions for the Arduino code sp.write(Buffer([myFirstAction])); sp.write(Buffer([mySecondAction])); sp.write(Buffer([myThirdAction])); } 

通过这种方式,Arduino可以轻松地将Serial.read()数据(注意,您需要在某处定义数据头和数据页脚)

 void readCommands(){ while(Serial.available() > 0){ // Read first byte of stream. uint8_t numberOfActions; uint8_t recievedByte = Serial.read(); // If first byte is equal to dataHeader, lets do if(recievedByte == DATA_HEADER){ delay(10); // Get the number of actions to execute numberOfActions = Serial.read(); delay(10); // Execute each actions for (uint8_t i = 0 ; i < numberOfActions ; i++){ // Get action type actionType = Serial.read(); if(actionType == 0x01){ // do you first action } else if(actionType == 0x02{ // do your second action } else if(actionType == 0x03){ // do your third action } } } } } 

我希望我很清楚,我希望它有帮助! 干杯!