последовательные данные arduino nodejs разбиты на фрагменты и не синхронизированы
Я пытаюсь заставить Arduino отправлять данные на узел, но безуспешно. Я подключаюсь к ar-drone 2.0 как в https://gist.github.com/maxogden/4152815
Вот мой код Arduino:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include "Adafruit_HTU21DF.h"
/*
Sketch per creare json contenente
lat,lon,data,ora,temp, hum
*/
static const int GPS_RXPin = 16, GPS_TXPin = 10;
static const uint32_t GPSBaud = 9600;
Adafruit_HTU21DF htu = Adafruit_HTU21DF();
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(GPS_RXPin, GPS_TXPin);
//JSON
const size_t bufferSize = JSON_OBJECT_SIZE(6);
DynamicJsonBuffer jsonBuffer(bufferSize);
JsonObject& oData = jsonBuffer.createObject();
void setup()
{
Serial1.begin(9600);
Serial.begin(9600);
ss.begin(GPSBaud);
if (!htu.begin()) {
Serial1.println("Couldn't find Adafruit_HTU21DF!");
while (1);
}
}
void loop()
{
float lat = gps.location.lat();
float lon = gps.location.lng();
float date = gps.date.value();
float timestamp = gps.time.value();
float temp = htu.readTemperature();
float hum = htu.readHumidity();
Serial1.print(lat);
Serial1.print(";");
Serial1.print(lon);
Serial1.print(";");
Serial1.print(date);
Serial1.print(";");
Serial1.print(timestamp);
Serial1.print(";");
Serial1.print(temp);
Serial1.print(";");
Serial1.print(hum);
Serial1.print(";\n");
//////
Serial.print(lat);
Serial.print(";");
Serial.print(lon);
Serial.print(";");
Serial.print(date);
Serial.print(";");
Serial.print(timestamp);
Serial.print(";");
Serial.print(temp);
Serial.print(";");
Serial.print(hum);
Serial.print(";\n")
smartDelay(1000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial1.println(F("No GPS data received: check wiring"));
}
// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
а это мой код NodeJS:
var serialport = require('node-serialport');
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({host:'0.0.0.0',port: 9999});
var sp = new serialport.SerialPort("/dev/ttyO3", {
parser: serialport.parsers.readline("\n"),
baud: 9600,
buffersize: 65536
});
wss.on('connection', function(ws) {
ws.send('connected');
ws.on('message', function(message) {
console.log('received: %s', message);
});
sp.on('data', function(chunk) {
var fromArduino = chunk.toString();
ws.send(fromArduino);
console.log(fromArduino);
});
});
Хотя CSV отлично отображается на последовательном мониторе Arduino IDE, на консоли ws и node все запутано.
Я использую эту версию NodeJS и node-serial: https://github.com/felixge/node-cross-compiler/downloads
и установите ttyO3 как в https://gist.github.com/maxogden/4152815
Между приемником дрона и TX1 Arduino установлен преобразователь напряжения для понижения сигнала с 5 В до 1,8 В.
Спасибо за любую помощь!
Лоренцо
ОБНОВЛЕНИЕ 2 ИЮНЯ 2018 ГОДА Мне удалось немного улучшить ситуацию с помощью следующего кода: АРДУИНО: #включать #включать #include "Adafruit_HTU21DF.h" /* Эскиз для создания содержимого JSON широта,долгота,данные,ориентир,температура,влажность */ статическая константа uint32_t GPSBaud = 9600;
Adafruit_HTU21DF htu = Adafruit_HTU21DF();
// The TinyGPS++ object
TinyGPSPlus gps;
void setup()
{
Serial1.begin(9600);
// Serial.begin(9600);
if (!htu.begin()) {
Serial1.println("Couldn't find Adafruit_HTU21DF!");
while (1);
}
}
void loop()
{
while (Serial1.available()) {
gps.encode(Serial1.read());
}
float lat = gps.location.lat();
float lon = gps.location.lng();
int date = gps.date.value();
float timestamp = gps.time.value();
float temp = htu.readTemperature();
float hum = htu.readHumidity();
Serial1.print(lat);
Serial1.print(";");
Serial1.print(lon);
Serial1.print(";");
Serial1.print(date);
Serial1.print(";");
Serial1.print(timestamp);
Serial1.print(";");
Serial1.print(temp);
Serial1.print(";");
Serial1.print(hum);
Serial1.print(";_");
Serial1.println();
}
УЗЕЛ JS:
var serialport = require('node-serialport');
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({host:'0.0.0.0',port: 9999});
var sp = new serialport.SerialPort("/dev/ttyO3", {
parser: serialport.parsers.readline("_"),
// парсер: serialport.parsers.raw,
baud: 9600,
buffersize: 1024
});
wss.on('connection', function(ws) {
sp.on('data', function(chunk) {
var fromArduino = chunk.toString();
// console.log(fromArduino);
ws.send(fromArduino);
sp.flush();
});
});
Теперь данные в большинстве случаев выводятся аккуратно как на консоль, так и на ws: полагаю, проблема была в размере буфера последовательного порта.
Я также удалил последовательное программное обеспечение из кода Arduino.
@lbrutti, 👍0
Обсуждение1 ответ
Serial.print(lat);
Serial.print(";");
Serial.print(lon);
Serial.print(";");
Serial.print(date);
Serial.print(";");
Serial.print(timestamp);
Serial.print(";");
Serial.print(temp);
Serial.print(";");
Serial.print(hum);
Serial.println(";");
Serial.println
напечатает \r\n
в конце (источник). \r
— это «возврат каретки», который переместит курсор обратно в начало строки.
Поскольку вы читаете свои данные с помощью парсера, который ищет \n
и удаляет его, у вас остается строка, которая выглядит как [csv data..]\r
. Как только вы выведете это на консоль дословно, вы получите то поведение, на которое смотрите.
Замените Serial.println(";");
на Serial.print(";\n");
(то же самое для Serial1
) и посмотрите, что произойдет.
- Разбор строк приема Arduino
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- Последовательная связь между ESP8266 и Arduino Uno
- Arduino Преобразование std:string в String
- Как связаться с датчиком через порты RX/TX Arduino?
Не вижу, в чем проблема, но несколько упрощений могут помочь вам определить проблему: 1. Избавьтесь от SoftwareSerial и используйте только аппаратный последовательный порт: RX от GPS и TX для дрона. 2. Удалите код HTU и JSON из Arduino. 3. Удалите код WebSockets из Node.js. 4. Используйте
parsers.readline("\r\n")
, так как именно его отправляетSerial.println()
., @Edgar Bonetпоскольку последовательный монитор показывает правильные данные, я подозреваю, что ваш код NodeJS содержит ошибку... поэтому это не вопрос Arduino, @jsotola
@lbrutti попробуйте избавиться от своего парсера и напрямую выводить каждый полученный символ с устройства UART (
/dev/ttyO3
) на консоль как можно быстрее. Возможно, буфер UART переполняется, когда он не считывается достаточно быстро. Вы также пробовали предложение Эдгара?, @Maximilian GerhardtПривет, я попробовал удалить ws и software serial. Все равно вывод node выходит кусками. Я попробую обойти парсеры и дам вам знать. Спасибо, @lbrutti
@maximilian-gerhardt: я упростил код, удалив программный последовательный порт и используя меньший буфер. Данные в большинстве случаев выводятся аккуратно: не всегда, но это приемлемо для этой ранней стадии прототипирования., @lbrutti
Хм, на таких скоростях проблем с считыванием быть не должно. Можете попробовать снизить скорость передачи данных? (4800, 1200, 300), @Maximilian Gerhardt
На самом деле, да, ожидается, что последовательный интерфейс NodeJS будет выдавать «куски», ваш код должен поместить их в буфер и выполнить разграничение., @Paul
всего одна мисс, сэр, только вместо этого используйте "baudRate:", а не " бод". Что такое вар бод сэр??? Спасибо., @abu-ahmed al-khatiri