2015-05-08 3 views
0

Я использую узел serialport для связи с доской Arduino Uno. Следующий код - это то, что я использовал.Узел SerialPort

serialPort.on("open", function() { 
    console.log('open'); 
    serialPort.on('data', function(data) { 
    console.log('data received: ' + data); 
    }); 
    serialPort.write('s1\n', function(err, results) { 
    if(err) 
     console.log('err ' + err); 
    else 
     console.log('results ' + results); 
    }); 
});  

Когда я дать ввод как «s1» от терминала (например, TeraTerm или холодный термин) я получаю 0 или 1 в качестве результата. В принципе, s1 является командой для считывания состояния конкретного датчика. Если датчик активирован, то возвращается 1, и если он не возвращается 0.

Однако, в приведенном выше фрагменте кода, я получаю результаты как 3 (это число символов в строке, используемой для ввода. Таким образом, вместо 's1 \ n', если я ставил 's11 \ n' результат возвращается как 4. Что я делаю неправильно здесь?

Событие .on ('data') никогда не запускается. Но триггеры события .on ('open'), что указывает на то, что соединение с доска нормально

+0

вы можете рассказать мне, какие параметры для парсера, например, синтаксический анализатор строки: com .parsers.readline ('\ r \ n') https://github.com/voodootikigod/node-serialport/blob/master/examples/readdata.js – Dino

+0

Определенный парсер не определен. – Aneesh

+0

попробуйте установить его только на '\ n' – Dino

ответ

0

вызов записи неблокирующий и результат bytesWritten, поэтому значения, которые вы видите смысл Хотя перепроверки docs я также нашел это супер полезное примечание:..

Note: Some devices like the Arduino reset when you open a connection 
to them. In these cases if you immediately write to the device they 
wont be ready to receive the data. This is often worked around by 
having the Arduino send a "ready" byte that your node program waits for 
before writing. You can also often get away with waiting around 400ms. 

Я могу подтвердить это. Перед отправкой запросов мы ожидаем сообщение «--start--» из прошивки.

Бонус: следите за оставшимся барахлом в буферах, когда Arduino сбрасывается. Я видел такие сообщения, как «TemperatureUpdat - start ...». 2 идеи для решения этой проблемы:

  • сканирование для «--start--» с использованием команды endsWith, а не точное совпадение. Недостатком является то, что вы не можете иметь «--start--» в любых других сообщениях. будьте умны о отправляемом сообщении, и это станет проблемой без проблем).
  • отправьте пустую строку, затем сообщение начала (например, «\ nstart \ n»). Недостатком является то, что вам нужно ожидать этих двух сообщений (т. Е. Пустого сообщения или мусора или частичного сообщения, за которым следует действительная команда пуска)
Смежные вопросы