2013-06-12 4 views
3

Я работаю над проектом Arduino для управления двигателями и считывания датчиков. Я решил использовать веб-представление, используя Node.js в качестве среднего канала для чтения/записи из последовательного порта в браузер, используя либо библиотеки (SerialPort, и SerialPort2).Arduino wireless и Node.js

Оба работают нормально, когда я подключаю Arduino непосредственно к USB-устройству с помощью провода, но Node.js не может ничего читать, когда я подключаю Arduino к USB-устройству через мой беспроводной адаптер ** (APC220), хотя я могу читать все полученные на нем с помощью последовательного монитора Arduino.

Я проверил все возможные причины этого; Я проверил скорость передачи данных, которую я использую для связи с Arduino, с последовательностью wirelss и APC220 и мостовым разъемом (USB-to-serial converter). Все они имеют одинаковые настройки: 9600 бод-скорости, без контроля четности/потока, бит данных: 8, стоповые бит: 1.

Поведение выглядит следующим образом. Он подключается к COM port без проблем, а затем я попытался напечатать ошибки, но, похоже, их не идентифицируют ни библиотеки SerialPort. Тогда никакое чтение не приходит к событию (данным), что означает, что он (Node.js) не взаимодействует с последовательным портом, хотя он открыт.

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

В чем проблема?

сервер [Node.js]:

var SerialPort = require('serialport2').SerialPort; 
var portName = 'COM15'; 

var io = require('socket.io').listen(8000); // Server listens for socket.io communication at port 8000 
io.set('log level', 1); // Disables debugging. This is optional. You may remove it if desired. 

var sp = new SerialPort(); // Instantiate the serial port. 
sp.open(portName, { // portName is instatiated to be COM3, replace as necessary 
    baudRate: 9600, // This is synchronised to what was set for the Arduino code 
    dataBits: 8, // This is the default for Arduino serial communication 
    parity: 'none', // This is the default for Arduino serial communication 
    stopBits: 1, // This is the default for Arduino serial communication 
    flowControl: false // This is the default for Arduino serial communication 
}); 

io.sockets.on('connection', function (socket) { 
    // If socket.io receives message from the client browser then 
    // this call back will be executed. 
    socket.on('message', function (msg) { 
     console.log(msg); 
    }); 
    // If a web browser disconnects from Socket.IO then this callback is called. 
    socket.on('disconnect', function() { 
     console.log('disconnected'); 
    }); 
}); 

var cleanData = ''; // This stores the clean data 
var readData = ''; // This stores the buffer 
sp.on('data', function (data) { // Call back when data is received 
    readData = data.toString(); // Append data to buffer. 
    // If the letters '[' and ']' are found on the buffer then isolate what's in the middle 
    // as clean data. Then clear the buffer. 
    console.log(readData); // **Here you should be able to print the data if you receive any** 
    if (readData.indexOf(']') >= 0 && readData.indexOf('[') >= 0) { 
     cleanData = readData.substring(readData.indexOf('[') + 1, readData.indexOf(']')); 
     readData = ''; 
     console.log("-- "+cleanData); 
     io.sockets.emit('message', cleanData); 
    }else if(readData.indexOf('[') >= 0){ 
     cleanData = readData.substring(readData.indexOf('[') + 1, readData.length); 
     readData = ''; 
    }else if(readData.indexOf(']') >= 0){ 
     cleanData += readData.substring(0, readData.indexOf(']')); 
     readData = ''; 
     console.log("-- "+cleanData); 
     io.sockets.emit('message', cleanData); 
    }else{ 
     cleanData += readData; 
     readData = ''; 
    } 
    //console.log(readData); 
    //io.sockets.emit('message', readData); 
}); 

ответ

0

Если монитор не работает ни одна другая программа может прочитать серийный порт.

В случае, если вы не открываете оба одновременно, тогда все сложнее. Мое предложение было бы шпионить за проволокой. То есть: установите Wireshark и посмотрите данные о последовательном соединении/шине USB.

Возможно, вы также захотите проверить, как последовательный порт APC220 и Arduino отличаются друг от друга в отношении их последовательных/USB-преобразователей. Еще одна идея - проанализировать этот вопрос в Linux, поскольку может дать больше информации о низкоуровневых различиях чип-наборов/активности USB. Конечно, если у вас нет опыта Linux, это трудно сделать, но, возможно, вы знаете некоторых энтузиастов Linux.

+0

Я не использую последовательный монитор одновременно с сервером, я знаю, что это вызовет столкновение (занятое/используемое другим приложением ..). Это хорошая идея. В ближайшее время я попытаюсь проанализировать пакеты с помощью некоторого подробного последовательного порта. , но я уже проверил настройки преобразователя, они в порядке. Фактически, поскольку он работает с последовательным монитором и последовательным считывателем java (я использовал его в другом проекте java), это означает, что проблема находится в библиотеке последовательных портов в узле js. Возможно, потребуется небольшая манипуляция в зависимости от результатов анализа. Спасибо, – CME64

+0

, учитывая, что вы сказали в своем комментарии, вы должны указать код, который вы написали в javascript, чтобы открыть последовательный порт для нас, чтобы помочь вам в этой части. В какой библиотеке вы использовали, как вы открываете последовательную линию? Вы выполняете правильные настройки терминалов? вы пытались сделать простейшую программу возможной, чтобы отправить «Hello world» из arduino на хостинг и обратно? – zmo

+0

Добавлен код @zmo, но я считаю, что мой вопрос будет выглядеть сложным, если это не так; нет ничего плохого в коде, поскольку он работает над проводом, но когда я использую беспроводную связь, он работает на любом считывателе с последовательным портом, например (java, arduino ..), отличном от библиотеки js serialport узла. Если мне нужно пройти через это, что будет решение bruteforce, и это займет у меня время. поэтому я поставил вопрос. – CME64

-1

Хорошо, оба кодекса выглядят правильно, поэтому я уверен, что ваша проблема - это нечто очевидное (например, нос посередине вашего лица), которого вы не видите, потому что вы слишком сосредоточены на деталях. Так вот контрольный список я бы сделал первым:

  • Вы уверены ваш последовательный интерфейс является COM15, и никогда не меняется?
  • Вы уверены, что оба устройства APC имеют правильную скорость передачи?
  • Вы попробовали сделать свой Arduino отправкой простого кода, который отправляет то же самое по каналу?

Как:

void loop() { 
    ...println("TEST"); 
    delay(1000); 
} 

А на хосте:

sp.on('data', function (data) { 
    console.log(data.toString()); 
}); 

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

Просто сделайте это максимально простым, как вы можете. (И не забудьте добавить задержку в петлю Arduino, или у вас могут возникнуть трудности с повторной установкой чипа).

Вы также можете добавить в код ошибки, ловя часть serialport2:

port.on('error', function(err) { 
    console.log("ERROR receiving serial data: ", err); 
}); 

Как и для open() заявления:

sp.open(portName, portConfig, function (err) { 
    console.log("ERROR opening serial port: ", err); 
}); 

Как может отсутствовать сообщения об ошибках на сторона хозяина!

+0

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

+0

, конечно, я не сужу ваших способностей, но, как и любой другой разработчик, вы, возможно, пропустили что-то, что может быть действительно очевидным! Особенно с проектами, основанными на ардуинах, я не считаю, сколько раз я проверял все ** кроме ** той маленькой глупой вещи, которая сводит меня с ума. – zmo

+0

Я читал снова (и дважды) все, что вы написали, и ясно, что вы сделали все, что я сделал бы, и это может быть сделано на этапе отладки (без привлечения логического анализатора, который может быть другим ардуином устройство, чтобы увидеть, действительно ли что-то происходит между беспроводным устройством и чипом FTDI, или с помощью проводов ...). – zmo

Смежные вопросы