Официальный сайт компании Arduino по адресу arduino.cc
передать координаты строкой
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 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());
Ага, спасибо. И как альтернативный вариант. Правильно так?
Радио и GPS под водой не работают.
Вот эта строчка нужна? Serial.write(0xAA);
Или в пересылаемом потоке может встретиться 0xAA и передаче кирдык. Как организовать начало?
Радио и GPS под водой не работают.
:-))) Спасибо
Я иногда всплываю. Тогда это и должно работать.
Вот эта строчка нужна? Serial.write(0xAA);
Или в пересылаемом потоке может встретиться 0xAA и передаче кирдык. Как организовать начало?
Эта строчка отсылает так называемый префикс или хидер. Принимающая сторона постоянно проверяет поток байтов и должна, как только словит хидер, синхронизироваться по нему, начиная интерпретировать все дальнейшие байты, как данные структуры. Т.е. хидер позволяет обработать ситуацию, когда принимающая сторона начала анализировать поток данных с середины пакета.
И, да, 0xAA может встретиться в данных. Искусство передачи пакета состоит в том, чтобы выбрать такой хидер, который бы не присутствовал в остальном пакете. И неплохо бы ещё контрольную сумму в конце заслать. Если, конечно, требуется получить именно те данные, которые были переданы, а не случайные помехи.
Однако, если ваш приёмопередатчик сам формирует пакет, защищает его CRC и пр., то лишние байты передавать нет необходимости. К сожалению - я не работал с APC220 и не могу сказать о том, как он организует передачу.
Спасибо за исчерпывающий ответ. Начну с простых решений. Если не будет удовлетворительно, то будем усложнять