串口不工作?

问题描述:

我做了一个程序,向我的arduino发送数据,它检测发送的内容,然后根据按什么键打开正确的引脚。串口不工作?

当使用从我的Windows电脑软件的Arduino Arduino的素描作品很好,我可以通过发送已经或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); 
} 
+0

更新,通过它的外观arduino没有检测到可用的串行端口。我不知道这是否有帮助。 –

+0

我的第一个想法是,串行端口被检测到并正在工作(由于led闪烁)。我的猜测是在发送端。尝试使用谷歌搜索“ComEmulDrv3”。它应该让你建立一个虚拟comport让你验证你的发送。要寻找的东西包括字符编码和空格。 – cstrutton

我最近涉足到这个。 Arduino从Arduino IDE以外的大多数产品接收串行通信时会自动重置。这就是为什么你可以从IDE发送而不是node.js.

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

+0

嗯,但这些例子甚至要求您重新启动arduino:S –

+0

为了让IDE上传代码,它必须能够重启Arduino。因此,无论何时进行上传,您都必须移除电容,让其上传,然后更换电容串行以正常工作(无需重新启动)。你的代码看起来不错,特别是当它从IDE发送串行数据时能正常工作。 – ZnArK

+0

嗯,但是当使用它发送的IDE时,使用节点时它不会。目前我正在等待一个逻辑电平转换器,这样我就可以将其与Raspberry Pi上的串行端口一起使用。如果我不这样做,那么我会再次发布;) –

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

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

上传过程是:重置启动启动加载程序的Arduino,在Arduino IDE中启动上传过程,建立通信,上传,然后运行加载的代码。当Arduino启动时,它会等待短时间上传,如果没有收到,它会继续运行代码。

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

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

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

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

而且,对于这一点,我认为你会用一些“逻辑”界面较好,数据报头,数行动,这样的东西。这对你来说不是必需的,但它会使你的代码更健壮,更容易修改。

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

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

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