Последовательный порт не работает?

Я создал программу, которая отправляет данные в мое arduino, которая определяет, что было отправлено, а затем включает правильный вывод в зависимости от того, какая клавиша нажата.

При использовании программного обеспечения arduino с моего компьютера с Windows эскиз Arduino работает нормально, я могу включить или выключить каждый вывод, отправив либо W A S, либо D.

При отправке через узел индикатор RX на Arduino мигает, но больше ничего не происходит.

Кто-нибудь может помочь?

Программа 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);
}
 cstrutton06 июн. 2012 г., 17:16
Первая мысль, что последовательный порт обнаружен и работает (из-за мигающего светодиода). Я думаю, на конце отправки. Попробуйте поискать в Google «ComEmulDrv3». Это должно позволить вам настроить виртуальный компорт, позволяющий вам проверить, что вы отправляете. Вещи для поиска включают кодировку символов и пробелы.
 Ryan Walmsley05 июн. 2012 г., 20:45
Обновление, судя по всему, Arduino не определяет последовательный порт как доступный. Я не знаю, помогает ли это.

Ответы на вопрос(4)

Решение Вопроса

ении последовательной связи от большинства вещей, кроме Arduino IDE. Вот почему вы можете отправлять из IDE, но не node.js.

У меня есть Uno и я положил конденсатор между Reset и Ground. Вот страница с хорошей информацией по этому вопросу.
Удачи.http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

 Ryan Walmsley07 июн. 2012 г., 22:07
Хм, но при использовании IDE он отправляет, при использовании узла не делает. В данный момент я жду преобразователя логического уровня, чтобы я мог использовать его с последовательными портами на моем Raspberry Pi. Если это не сработает, когда я это сделаю, я снова напишу;)
 Ryan Walmsley07 июн. 2012 г., 11:48
Хм, но примеры даже просят вас перезагрузить Arduino: S
 08 июн. 2012 г., 13:28
Это совершенно правильно, без конденсатора / резистора у вас есть несколько вариантов последовательной связи. Я совершенно уверен, что ваше приложение node.JST будет работать, как только вы попытаетесь добавить это.
 07 июн. 2012 г., 15:43
Для того чтобы среда IDE могла загрузить код, она должна иметь возможность перезагрузить Arduino. Таким образом, всякий раз, когда вы делаете загрузку, вы должны удалить конденсатор, позволить ему загрузить, а затем заменить конденсатор для последовательной работы для правильной работы (без перезапуска). Ваш код выглядит хорошо, особенно если он работает правильно при отправке последовательных данных из IDE.
 14 янв. 2016 г., 00:00
Visual Micro, я могу подтвердить ваше замечание об отключении DTR в C #, и это работает с Arduino. Для node.js я нашел эту статьюbarryvandam.com/node-js-communicating-with-arduino где они инициализируют последовательный порт с помощью «flowControl: false»; Я ожидаю, что это не должно посылать какой-либо сигнал на выводы DTR / DTS: serialPort = new SerialPort (portName, {скорость передачи: 9600, dataBits: 8, четность: & ap;; none & apos ;, stopBits: 1, flowControl: false});

но в том, что последовательный порт был открыт - но недоступен для записи, пока сброс не завершится. Установка задержки 3 с перед записью в порт устранила проблему. Написание ASCII не было проблемой.

Существует небольшой конденсатор между одной из последовательных линий управления и сброса на Arduino в более поздних моделях. Этот конденсатор заставляет Arduino сбрасываться при открытии порта, но в остальном не мешает нормальной последовательной работе.

Этот трюк сброса позволяет загружать код для сброса Arduino как части процесса загрузки. Когда Arduino запускается, загрузчик кода запускается сначала в течение короткого времени до запуска загруженного кода.

Процесс загрузки: Сбросьте Arduino, который запускает загрузчик, запустите процесс загрузки в Arduino IDE, установите связь, загрузите, затем запустите загруженный код. Когда Arduino запускается, он ждет загрузки в течение короткого периода времени, если ничего не получено, он переходит к выполнению кода.

Я считаю это очень полезным, поскольку оно позволяет нам эффективно сбрасывать Arduino, просто закрывая и открывая порт. В старых Arduino без этого конденсатора вам приходилось нажимать кнопку сброса в нужное время, чтобы получить код для загрузки. А время было таким, что Arduino провел гораздо больше времени в ожидании, прежде чем начать с загруженного кода.

В проблеме, описанной здесь, я не верю, что у него были какие-либо проблемы из-за использованного трюка сброса. Это должно было иметь только эффект сброса Arduino, когда он открыл последовательный порт, и, судя по его информации, это желаемый побочный эффект.

или bt, и в обоих случаях он отлично работает. Я думаю, что ваша проблема заключается в отправке писем. Вместо этого вы должны отправить буфер со значением буквы 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
                }
            }
        }
    }
}

Я надеюсь, что я ясен, и я надеюсь, что это помогает! Ура!

Ваш ответ на вопрос