Node.js не может распознавать символы из последовательного порта

Следующий скрипт печатает все нормально, он распознает целые числа из последовательного порта, но не может распознавать символы. Оператор if не работает с символами. Я пробовал как ==, так и === в операторе if

var SerialPort = require('serialport')
var Readline = SerialPort.parsers.Readline
var serialPort = new SerialPort('/dev/ttyAMA0', {//ttyAMA0
  baudRate: 9600
})

var parser = new Readline()
serialPort.pipe(parser)
parser.on('data', function (data) {
if(data === 'c'){/// c не распознается
  console.log('data received: ' + data)
}

})
serialPort.on('open', function () {
  console.log('Communication is on!')
})

Код Arduino выглядит следующим образом:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); // прием, передача
int x = 0;
int y = -30000;
int z = 0;
String data;
char command = 'q';
int left = 0;
int right = 0;
int left_pwm = 0;
int right_pwm = 0;

void setup() {
  mySerial.begin(9600);     // открывает последовательный порт, устанавливает скорость передачи данных 9600 бит/с
  Serial.begin(9600);
  }
void loop() {//данные карты и компаса
if (y==30000) {
 mySerial.println('c');
 delay(5);
 mySerial.println(299);
 delay(5);
 z = -25000;
 } 

 if(z==30000){
 mySerial.println('lon');   
 delay(5);    
  mySerial.println(529);
  delay(5);
  mySerial.println('lat');   
 delay(5);
   mySerial.println(522);
          y = -30000;
    }
  y++; z++;

  if (!mySerial.available()) {
    return;
  }

  data = mySerial.readString();
   sscanf(data.c_str(), "%c%01d%01d%03d,%03d", &command, &left, &right, &left_pwm, &right_pwm);

  if (command == 'n') { // мы получили команду навигации
    // соответствующим образом обновить GPIO, это происходит только один раз после получения новой команды 'n'
    Serial.print(command);
    Serial.print(left);
    Serial.print(right);
    Serial.print(left_pwm);
    Serial.print(",");
    Serial.println(right_pwm);
    }

    }////конец цикла

, 👍1

Обсуждение

почему эта команда не перед оператором if? console.log('данные получены: ' + данные), @jsotola

Вы пытались обрезать «данные» из всего пробела?, @chrisl

Журнал консоли @jsotola сообщает мне, что оператор if не работает., @Harry Hobson

@chrisl данные = data.trim(); Бинго, Спасибо!, @Harry Hobson

@HarryHobson, журнал консоли внутри оператора if не позволяет вам увидеть, какие данные были получены ... это плохая процедура отладки, @jsotola


1 ответ


Лучший ответ:

0

Если вы используете анализатор строк в Nodejs, он не удаляет все символы конца строки. Я думаю (хотя сейчас не могу это привести), что из строки удаляется только символ 'ņ'. Но Serial.println() отправляет "\r\n" в качестве конца строки. Это означает, что ваша строка "c\r", которая не равна "c".

Используя метод trim() типа String, вы можете удалить все пробелы в начале и в конце строки, включая символы конца строки, такие как '\r'.

,