Десятичные числа, отправленные через последовательный порт, разделяются и отправляются в течение нескольких тактов.
Вот мой скетч 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 отправлять данные только в том случае, если это полное значение, а не разделенные значения?
@J Edwards, 👍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.
- Как отправить HTTP-post данные в Node Express API с Arduino esp822 6?
- Как отправить ИК-данные с Arduino на USB-TTL
- Отправка данных в Arduino через Nodejs: Arduino не возвращает данные
- SerialPort Node.js завис в состоянии «Ошибка»
- Node.js не может распознавать символы из последовательного порта
- Компиляция/загрузка скетча Arduino Nano/Uno и js из браузера
- Не уверен, какой Arduino выбрать.
- Как использовать SPI на Arduino?
Понятия «полное значение» не существует. Серийность работает с символами. Именно это и означает серийность. Получателю необходимо объединить отдельные символы в полноценные строки., @Majenko