последовательные данные 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 все запутано.

консоль дрона показывает испорченные строки, монитор adruino ide показывает их нормально

Я использую эту версию 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.

, 👍0

Обсуждение

Не вижу, в чем проблема, но несколько упрощений могут помочь вам определить проблему: 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


1 ответ


2
  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) и посмотрите, что произойдет.

,