Могу ли я использовать строку и целое число в Serial.println вместе?

Я только вчера начал программировать на Arduino, и у меня возникла небольшая проблема.

Я хочу напечатать "#S|SKAITYMAS|[1]#" в одной строке, но вместо "1" я хочу использовать значение int . Однако это не работает:

Serial.println("#S|SKAITYMAS|[",LINENR,"]#");

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

, 👍1


3 ответа


Лучший ответ:

3

Сделайте что-то вроде этого:

Начните со своей строки и целого числа:

String string = "PI is equal to ";
int integer   = 3.1416;

Затем поместите это в свой цикл:

Serial.print(string);  // строка здесь
Serial.print(integer); //целое здесь

Serial.println();      //изменить строку

Serial.print() не изменяет строку. Это Serial.println(), который является печатью, которая меняет строку, поэтому все, что печатается без println, будет в одной строке.

,

Вышеописанный метод будет работать нормально, но если вы хотите ускорить процесс, я рекомендую использовать 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


4

Ответ 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


-1

Это можно сделать способом 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);  

Не делайте все в одну строку, как описано в ссылке на страницу выше.

,