2012-06-05 33 views
8

我做了一個程序,向我的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

回答

9

我最近涉足到這個。 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上的串行端口一起使用。如果我不這樣做,那麼我會再次發佈;) –

1

關於電容器和復位問題... 在其中一個串行控制線之間有一個小電容,並在後面的型號中的Arduino上覆位。這個電容會導致Arduino在端口打開時復位,否則不會干擾正常的串行操作。

這個重置技巧允許代碼上傳來重置Arduino作爲上傳過程的一部分。當Arduino啓動時,代碼啓動加載程序在加載的代碼運行之前先運行一小段時間。

上傳過程是:重置啓動啓動加載程序的Arduino,在Arduino IDE中啓動上傳過程,建立通信,上傳,然後運行加載的代碼。當Arduino啓動時,它會等待短時間上傳,如果沒有收到,它會繼續運行代碼。

我覺得這非常有用,因爲它使我們能夠通過關閉和打開端口來有效地重置Arduino。在舊的Arduino中,沒有這個電容器,你必須在合適的時間按下重置按鈕來獲取代碼上傳。時間是這樣的,Arduino在上傳代碼之前花了更多的時間等待。

在這裏描述的問題,我不認爲他有任何麻煩,由於使用重置技巧。當他打開串口時,應該只有重置Arduino的效果,並且從他的信息看,這是一個理想的副作用。

1

我每天使用節點通過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 
       } 
      } 
     } 
    } 
} 

我希望我很清楚,我希望它有幫助! 乾杯!