Почему Serial.write() работает, а Serial.print() нет?

Я тестирую свой GPS-модуль с ESP32, используя Arduino IDE. Я спрашиваю, потому что обычно не совсем понимаю разницу между Serial.write() и Serial.print().

Этот код отлично работает с Serial.write(), и вывод имеет смысл:

void loop() {
  while (Serial2.available() > 0) {
    Serial.write(Serial2.read());
  }

  Serial.println("-------------------------------------");
}

Вывод:

13:28:05.173 -> -------------------------------------
13:28:05.206 -> $GPRMC,,V,,,,,,,,,,N*53
13:28:05.238 -> $GPVTG,,,,,,,,,N*30
13:28:05.238 -> $GPGGA,,,,,,0,00,99.99,,,,,,*48
13:28:05.270 -> $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
13:28:05.334 -> $GPGSV,1,1,00*79
13:28:05.334 -> $GPGLL,,,,,,V,N*64
13:28:05.366 -> -------------------------------------

Когда я конвертирую этот код в Serial.print(), результат выглядит странно:

void loop() {
  while (Serial2.available() > 0) {
    Serial.print(String(Serial2.read()));
  }

  Serial.println("-------------------------------------");
}

Вывод:

13:26:43.118 -> -------------------------------------
13:26:43.150 -> -------------------------------------
13:26:43.214 -> 367180827767444486444444444444444444447842535113103671808684714444444444444444447842514813103671807171654444444444444844484844575746575744444444444442525613103671807183654465444944444444444444444444444444575746575744575746575744575746575742514813103671807183864449444944484842555713103671807176764444444444448644784254521310-------------------------------------
13:26:43.566 -> -------------------------------------
13:26:43.629 -> -------------------------------------

Почему Serial.write работает, а Serial.print — нет? Или: как написать тот же код с помощью Serial.print()?

, 👍2


3 ответа


2

Почему Serial.write работает, а Serial.print нет?

Serial.read() возвращает целое число для каждого байта из последовательного порта.

String преобразует каждое целое число в его десятичное представление ASCII (например, $ = "36", G = "71" и т. д.), поэтому Serial.print() получает строку ASCII с десятичными значениями каждого входного байта, которые уже были ASCII. Вероятно, это не то, что вам нужно.

,

-1

Что ж, @devnull дал хороший и полезный ответ. Я представлю другой метод использования Arduino для тестирования модуля GPS.

Вот пример тестового кода, который можно использовать для тестирования модуля GPS с ESP32 с помощью Arduino IDE и функции Serial.print():

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

// Настраиваем последовательное соединение для модуля GPS
HardwareSerial GPSSerial(2);
TinyGPSPlus gps;

void setup() {
  // Инициализируем последовательную связь с компьютером
  Serial.begin(115200);

  // Инициализировать последовательную связь с модулем GPS
  GPSSerial.begin(9600, SERIAL_8N1, 16, 17);
}

void loop() {
  // Чтение данных из модуля GPS
  while (GPSSerial.available() > 0) {
    gps.encode(GPSSerial.read());
  }

  // Печать данных GPS на серийный монитор
  Serial.print("Latitude: ");
  Serial.print(gps.location.lat(), 6);
  Serial.print(" Longitude: ");
  Serial.println(gps.location.lng(), 6);
  Serial.print("Altitude: ");
  Serial.print(gps.altitude.meters());
  Serial.println(" meters");
  Serial.print("Date: ");
  Serial.print(gps.date.month());
  Serial.print("/");
  Serial.print(gps.date.day());
  Serial.print("/");
  Serial.println(gps.date.year());
  Serial.print("Time: ");
  Serial.print(gps.time.hour());
  Serial.print(":");
  Serial.print(gps.time.minute());
  Serial.print(":");
  Serial.println(gps.time.second());
  Serial.println();

  // Подождите секунду перед повторной печатью данных
  delay(1000);
}

Этот код инициализирует последовательное соединение с модулем GPS, используя библиотеку HardwareSerial и библиотеку TinyGPS++ для анализа данных GPS. Функция loop() считывает данные с модуля GPS и распечатывает широту, долготу, высоту, дату и время на последовательном мониторе с помощью функции Serial.print(). .

Возможно, вам потребуется настроить параметры последовательного порта и скорости передачи данных в соответствии с вашим конкретным модулем GPS. Вы также можете добавить дополнительный код для обработки ошибок или проверки правильности данных GPS.

,

Это на самом деле не отвечает на вопрос, как задано., @Nick Gammon


-1

Я использую это только для получения данных из модуля GPS, библиотека не нужна вам нужно объявить массив, скажем, gps_rawData[200] = {0};

пока (SerialGPS.доступно()) { size_t byteCount = SerialGPS.readBytesUntil('\n', gps_rawData, sizeof(gps_rawData) - 1); gps_rawData[byteCount] = NULL; Строка gps_rawDataString = Строка (gps_rawData); SerialMon.println(gps_rawDataString);

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

,

Они спрашивают, почему Serial.write ведет себя так, а Serial.print ведет себя иначе, на что отвечает devnull., @timemage