Десятичные числа, отправленные через последовательный порт, разделяются и отправляются в течение нескольких тактов.

arduino-uno node.js

Вот мой скетч Arduino:

#include <HX711.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
HX711 hx(9, 10, 128, 0.002229);
LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {

  Serial.begin(9600);
  hx.set_offset(-9635);
  lcd.init();                      // инициализируем LCD
  lcd.backlight();
  lcd.begin(16,2);

}
void loop() {
  if(digitalRead(0) == LOW){
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("tare recieved");
    hx.tare();
  }

  double sum = 0;
  for (int i = 0; i < 10; i++) {
    sum += hx.bias_read();
    if(sum < 0) {
      sum = 0.00;
    }

  }
  sum = sum/10;
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("Weight");
  lcd.setCursor(5, 1);
  lcd.print(sum);
  lcd.print("g");
  Serial.println(sum);
  delay(10);
 }

Вот пример вывода, отображаемого на последовательном мониторе Arduino:

150.34
150.39
150.40
150.37
150.38

Проблема в том, что когда данные достигают node-serialport, значение разбивается на несколько строк.

 comport.on("data", function (data) {
    console.log(data.toString());
 }

Когда я регистрирую данные... они возвращаются вот так:

1
50.4
5
150.
49
15
0.47
150.
48
15
0.45

Можно ли как-то заставить Arduino отправлять данные только в том случае, если это полное значение, а не разделенные значения?

, 👍1

Обсуждение

Понятия «полное значение» не существует. Серийность работает с символами. Именно это и означает серийность. Получателю необходимо объединить отдельные символы в полноценные строки., @Majenko


1 ответ


1

Как пояснил в комментарии Маженко, последовательный канал не пакетируется: он передаёт отдельные байты и ничего больше. Если вам нужно передать понятие «пакет данных» или «полное сообщение», вам придется придумать Способ обозначения границ сообщения. Это называется «фреймингом» сообщения.

Ваш Arduino отправляет данные в формате ASCII. В этом случае наиболее распространённый способ Сообщения кадра построчные: каждое сообщение представляет собой одну строку, и каждая строка завершается последовательностью «конец строки». Стандартный символ конца строки последовательности — это CR (возврат каретки, т.е. 0x0d или '\r'), LF (строка поток, т.е. 0x0a или '\n'), и пара CRLF (CR, за которой следует LF, или "\r\n").

На самом деле вы уже это делаете: вы используете Serial.println(), и этот метод автоматически добавляет CRLF в конец всего, что он печатает. Теперь вам просто нужно разобрать это на другом конце: вы помещаете все входящие символы в буфер, пока не увидите, что входящие CRLF. Тогда вы знаете, что у вас есть полная строка, которую вы можете сообщить как все сообщение.

Эта процедура очень распространена, и для нее существует стандартный модуль Node.js. Это. Когда-то это было частью модуля последовательного порта, но, похоже, Выделено в отдельный модуль. Он называется parser-readline, и вы использовал бы это так:

const Readline = require("parser-readline"),
      parser = comport.pipe(new Readline({ delimiter: "\r\n" }));

parser.on("data", data => console.log(data.toString()));

См. документацию ReadLineParser.

,