Я работаю над проектом 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);
});
Я не использую последовательный монитор одновременно с сервером, я знаю, что это вызовет столкновение (занятое/используемое другим приложением ..). Это хорошая идея. В ближайшее время я попытаюсь проанализировать пакеты с помощью некоторого подробного последовательного порта. , но я уже проверил настройки преобразователя, они в порядке. Фактически, поскольку он работает с последовательным монитором и последовательным считывателем java (я использовал его в другом проекте java), это означает, что проблема находится в библиотеке последовательных портов в узле js. Возможно, потребуется небольшая манипуляция в зависимости от результатов анализа. Спасибо, – CME64
, учитывая, что вы сказали в своем комментарии, вы должны указать код, который вы написали в javascript, чтобы открыть последовательный порт для нас, чтобы помочь вам в этой части. В какой библиотеке вы использовали, как вы открываете последовательную линию? Вы выполняете правильные настройки терминалов? вы пытались сделать простейшую программу возможной, чтобы отправить «Hello world» из arduino на хостинг и обратно? – zmo
Добавлен код @zmo, но я считаю, что мой вопрос будет выглядеть сложным, если это не так; нет ничего плохого в коде, поскольку он работает над проводом, но когда я использую беспроводную связь, он работает на любом считывателе с последовательным портом, например (java, arduino ..), отличном от библиотеки js serialport узла. Если мне нужно пройти через это, что будет решение bruteforce, и это займет у меня время. поэтому я поставил вопрос. – CME64