Почему 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()
?
@mehmet, 👍2
3 ответа
Почему Serial.write работает, а Serial.print нет?
Serial.read()
возвращает целое число для каждого байта из последовательного порта.
String
преобразует каждое целое число в его десятичное представление ASCII (например, $ = "36", G = "71" и т. д.), поэтому Serial.print()
получает строку ASCII с десятичными значениями каждого входного байта, которые уже были ASCII. Вероятно, это не то, что вам нужно.
Что ж, @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.
Я использую это только для получения данных из модуля 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
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
- Ошибка чтения флэш-памяти, 1000
- Нужен ESP32 для использования 3 последовательных портов
- Не могу подключиться к плате ESP32 через последовательный порт
- Нужен пример того, как отправлять КОМАНДЫ AT на модуль SIm7000E GPS+LTE из ESP32 и читать эти ответы в последовательном мониторе
- ESP32 Arduino Bluetooth Serial не подключается повторно после отключения
- Управление потоком между устройством ESP32 и RS323
- Используя ESP32 GPIO, Serial.printf(...) печатает странные символы, когда ввод превышает 12 символов.
Это на самом деле не отвечает на вопрос, как задано., @Nick Gammon