簡體   English   中英

串口無法正常工作?

[英]Serial port not working?

我制作了一個程序,將數據發送到我的arduino,檢測發送的內容,然后根據按下的鍵打開正確的引腳。

當我從我的Windows計算機上使用arduino軟件時,arduino草圖工作正常,我可以通過發送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中啟動上傳過程,建立通信,上傳,然后運行加載的代碼。 當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
                }
            }
        }
    }
}

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

在我的情況下,問題是重置,但串口已打開 - 但在重置完成之前無法寫入。 在寫入端口之前放置3秒延遲修復了問題。 編寫ASCII不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM