передать координаты строкой

NaPlucke
Offline
Зарегистрирован: 05.02.2017

На ныряльщике передатчик - на плотике приёмник.  Нужно передавать координаты GPS в одну сторону - на плотик. Модули APC220 (dfrobot).  Как это реализовать попроще?
Пробую передавать строкой.
 

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

#define PIN_RXD 13
#define PIN_TXD 15
#define GPS_BAUD 9600

char myStrLat[20];
char myStrLng[20];

SoftwareSerial gpsSerial(PIN_RXD, PIN_TXD);
TinyGPSPlus tinyGps;

void setup()
{
  Serial.begin(9600);
  gpsSerial.begin(GPS_BAUD);
}

void loop()
{
  while (gpsSerial.available() > 0) {
    tinyGps.encode(gpsSerial.read());
    if (tinyGps.location.isUpdated()) {
      Serial.print("Latitude = ");
      Serial.println(tinyGps.location.lat(), 6);
      Serial.print("Longitude = ");
      Serial.println(tinyGps.location.lng(), 6);
      Serial.println("");

      double myLat = tinyGps.location.lat();
      double myLng = tinyGps.location.lng();

      for (int i = 0; i < 20; i++) {
        myStrLat[i] = ' ';
      }
      myStrLat[18] = '\r';
      myStrLat[19] = '\n';

      // преобразование переменной float x в строку
      dtostrf(myLat, 3, 7, myStrLat);

      for (int i = 0; i < 20; i++) {
        myStrLng[i] = ' ';
      }
      myStrLng[18] = '\r';
      myStrLng[19] = '\n';

      // преобразование переменной float x в строку
      dtostrf(myLng, 3, 7, myStrLng);

      String str2senden = "";
      str2senden += myStrLat;
      str2senden += myStrLng;

      Serial.write(0xAA);
      Serial.write(str2senden);
    }
  }
}

Ругается: "In function 'void loop()':
ZUZ_gps_smart:58:30: error: no matching function for call to 'HardwareSerial::write(String&)'
       Serial.write(str2senden);"

Подскажите, пожалуйста правильное решение.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

https://www.arduino.cc/reference/en/language/functions/communication/serial/write/

Serial.write(str) 

str: a string to send as a series of bytes.

Т.е. write принимает на вход только char[], но не String.

Если включать токсичный режим, то String тут вообще никуда не упёрлась и только осложняет задачу.

А если же не включать токсичность, то...  https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/c_str/

 

NaPlucke
Offline
Зарегистрирован: 05.02.2017

sadman41 пишет:
String тут вообще никуда не упёрлась и только осложняет задачу.

Мне бы попроще

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Мне попроще так: https://www.google.com/search?q=arduino+serial+struct , а вам - не знаю.

NaPlucke
Offline
Зарегистрирован: 05.02.2017
Правильно так?
char * str2 = str2senden.c_str();
Serial.write(str2);

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Можно и в две строки, но и в одну будет не хуже: Serial.write(str2senden.c_str());

NaPlucke
Offline
Зарегистрирован: 05.02.2017

Ага, спасибо. И как альтернативный вариант. Правильно так?

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

#define PIN_RXD 13
#define PIN_TXD 15
#define GPS_BAUD 9600

char myStrLat[20];
char myStrLng[20];

SoftwareSerial gpsSerial(PIN_RXD, PIN_TXD);
TinyGPSPlus tinyGps;

struct dataSent
{
  float latit;
  float longi;
};

void setup()
{
  Serial.begin(9600);
  gpsSerial.begin(GPS_BAUD);
}

void loop()
{
  while (gpsSerial.available() > 0) {
    tinyGps.encode(gpsSerial.read());
    if (tinyGps.location.isUpdated()) {

      double myLat = tinyGps.location.lat();
      double myLng = tinyGps.location.lng();

      dataSend  data;
      data.latSend = myLat;
      data.lngSend = myLng;

      Serial.write(0xAA);
      Serial.write((byte*)&dataSend, sizeof(dataSend));
    }
  }
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Радио и GPS под водой не работают.

NaPlucke
Offline
Зарегистрирован: 05.02.2017

Вот эта строчка нужна? Serial.write(0xAA);

Или в пересылаемом потоке может встретиться 0xAA и передаче кирдык. Как организовать начало?

NaPlucke
Offline
Зарегистрирован: 05.02.2017

rkit пишет:

Радио и GPS под водой не работают.

 

:-))) Спасибо

Я иногда всплываю. Тогда это и должно работать.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

NaPlucke пишет:

Вот эта строчка нужна? Serial.write(0xAA);

Или в пересылаемом потоке может встретиться 0xAA и передаче кирдык. Как организовать начало?

Эта строчка отсылает так называемый префикс или хидер. Принимающая сторона постоянно проверяет поток байтов и должна, как только словит хидер, синхронизироваться по нему, начиная интерпретировать все дальнейшие байты, как данные структуры.  Т.е. хидер позволяет обработать ситуацию, когда принимающая сторона начала анализировать поток данных с середины пакета. 

И, да, 0xAA может встретиться в данных. Искусство передачи пакета состоит в том, чтобы выбрать такой хидер, который бы не присутствовал в остальном пакете. И неплохо бы ещё контрольную сумму в конце заслать. Если, конечно, требуется получить именно те данные, которые были переданы, а не случайные помехи.

Однако, если ваш приёмопередатчик сам формирует пакет, защищает его CRC и пр., то лишние байты передавать нет необходимости. К сожалению - я не работал с APC220 и не могу сказать о том, как он организует передачу.

NaPlucke
Offline
Зарегистрирован: 05.02.2017

Спасибо за исчерпывающий ответ. Начну с простых решений. Если не будет удовлетворительно, то будем усложнять