передать координаты строкой
- Войдите на сайт для отправки комментариев
Ср, 09/10/2019 - 15:04
На ныряльщике передатчик - на плотике приёмник. Нужно передавать координаты 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);"
Подскажите, пожалуйста правильное решение.
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/
Мне бы попроще
Мне попроще так: https://www.google.com/search?q=arduino+serial+struct , а вам - не знаю.
Можно и в две строки, но и в одну будет не хуже:
Serial.write(str2senden.c_str());Ага, спасибо. И как альтернативный вариант. Правильно так?
#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)); } } }Радио и GPS под водой не работают.
Вот эта строчка нужна? Serial.write(0xAA);
Или в пересылаемом потоке может встретиться 0xAA и передаче кирдык. Как организовать начало?
Радио и GPS под водой не работают.
:-))) Спасибо
Я иногда всплываю. Тогда это и должно работать.
Вот эта строчка нужна? Serial.write(0xAA);
Или в пересылаемом потоке может встретиться 0xAA и передаче кирдык. Как организовать начало?
Эта строчка отсылает так называемый префикс или хидер. Принимающая сторона постоянно проверяет поток байтов и должна, как только словит хидер, синхронизироваться по нему, начиная интерпретировать все дальнейшие байты, как данные структуры. Т.е. хидер позволяет обработать ситуацию, когда принимающая сторона начала анализировать поток данных с середины пакета.
И, да, 0xAA может встретиться в данных. Искусство передачи пакета состоит в том, чтобы выбрать такой хидер, который бы не присутствовал в остальном пакете. И неплохо бы ещё контрольную сумму в конце заслать. Если, конечно, требуется получить именно те данные, которые были переданы, а не случайные помехи.
Однако, если ваш приёмопередатчик сам формирует пакет, защищает его CRC и пр., то лишние байты передавать нет необходимости. К сожалению - я не работал с APC220 и не могу сказать о том, как он организует передачу.
Спасибо за исчерпывающий ответ. Начну с простых решений. Если не будет удовлетворительно, то будем усложнять