Могу ли я использовать строку и целое число в Serial.println вместе?
Я только вчера начал программировать на Arduino, и у меня возникла небольшая проблема.
Я хочу напечатать "#S|SKAITYMAS|[1]#"
в одной строке, но вместо "1"
я хочу использовать значение int . Однако это не работает:
Serial.println("#S|SKAITYMAS|[",LINENR,"]#");
Мы будем признательны за любые подсказки или подсказки.
@Mantvydas, 👍1
3 ответа
Лучший ответ:
Сделайте что-то вроде этого:
Начните со своей строки и целого числа:
String string = "PI is equal to ";
int integer = 3.1416;
Затем поместите это в свой цикл:
Serial.print(string); // строка здесь
Serial.print(integer); //целое здесь
Serial.println(); //изменить строку
Serial.print() не изменяет строку. Это Serial.println(), который является печатью, которая меняет строку, поэтому все, что печатается без println, будет в одной строке.
Ответ canadiancyborg в порядке. Однако всегда лучше избегать использования объектов String, если это вообще возможно, поскольку они используют динамическое выделение памяти, что несет в себе некоторый риск фрагментации памяти. Просто и безопасно:
int answer = 42;
Serial.print("The answer is ");
Serial.println(answer);
Единственным недостатком является то, что постоянная строка ("Ответ есть") занимает некоторое количество оперативной памяти. Этого можно избежать, внедрив его в макрос F()
, что означает «держать это только во флэш-памяти». Тогда самая удобная для запоминания идиома:
int answer = 42;
Serial.print(F("The answer is "));
Serial.println(answer);
Он начал Arduino вчера, пусть это будет для него просто. Он еще не делает никаких программ с большим объемом памяти, так что не путайте его слишком сильно., @Dat Ha
@canadiancyborg: Вот почему я сделал свое первое предложение проще, чем ваше., @Edgar Bonet
Это можно сделать способом C:
sprintf()
можно использовать для создания форматированной строки, а затем Serial.println()
для отправки строки
char buf[32];
sprintf(buf, "#S|SKAITYMAS|[%d]#", LINENR);
Serial.println(buf);
или с классом String, как описано здесь:
https://www.arduino.cc/en/Tutorial/StringAdditionOperator
String str = "#S|SKAITYMAS|["
str += LINENR;
str += "]#";
Serial.println(str);
Не делайте все в одну строку, как описано в ссылке на страницу выше.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
Вышеописанный метод будет работать нормально, но если вы хотите ускорить процесс, я рекомендую использовать sprint и использовать только один раз функцию печати из Serial., @max246
Ну, как он сказал, вчера он начал с Arduino, давайте не будем забрасывать его какими-то сложными вещами. будь проще и крути, @Dat Ha
Да, просто указываю, что если вам нужен более быстрый способ, используйте sprintf. Ваше решение работает нормально., @max246
@ max246: У вас есть эталон, подтверждающий ваше утверждение?, @Edgar Bonet
У меня его нет, но я работал над проектом, в котором мне нужно было отправлять информацию довольно быстро, и из-за того, что я выполнял «печать» 10 раз, потому что каждый параметр был другого типа, это делало всю отправку медленной. Это, вероятно, не видно, если у вас есть простая программа, но когда вам нужно быстро отправить информацию и очень быстро вернуться, функция печати была самой медленной. Была и тема, подтверждающая это., @max246
@ max246: я только что провел простое сравнение, напечатав константную строку (или строку формата) и переменную типа int. Процессор sprintf() версии 871 не только работает медленнее, чем отдельные Serial.print(), но и увеличивает размер программы на 1314 байт и создает дополнительную копию сообщения в ОЗУ. Я рад, что sprintf() помог вам, но это, вероятно, связано с некоторыми условиями, очень специфичными для вашей программы. Вы не должны предполагать, что sprintf() в целом быстрее. И вы не должны слепо рекомендовать его отдельным принтам, особенно новичкам., @Edgar Bonet
Интересно, является ли использование «PI» в качестве примера «Integer» хорошей практикой, особенно для начинающих. Использование
3
вместо этого было бы лучше., @AJD