Как последовательно напечатать постоянную единственную строку и изменяющуюся переменную внутри нее?

Я хочу напечатать одну строку, включая переменную "val" только один раз, а не зацикливание или повторение одной и той же строки, и внутри нее значение будет меняться в соответствии с показаниями. Является ли это возможным? Если да, то как?

#define trigPin 5
#define echoPin 6

float distance(uint8_t T, uint8_t H);

void setup()
{
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    Serial.begin(9600);
    Serial.print("The object is: ");
}

void loop()
{
    float val = distance(32, 68);
    Serial.print(val);
    Serial.println(" cm away");
    delay(500);
}

, 👍-1

Обсуждение

Добро пожаловать в SE/Arduino! Пожалуйста, пройдите [экскурсию] и прочитайте "[спросить]". Затем вернитесь и [отредактируйте] свой вопрос. Пожалуйста, покажите нам код, который у вас есть. Это может быть код, который вы хотите запустить, но который не работает. Расскажите нам, что вы ожидаете и что вы получаете взамен., @the busybee

Какие? Извините, я не понимаю, что вы имеете в виду, @chrisl

Вы хотите напечатать что-то вроде «результат: 123» и заменить «123» другими значениями в той же строке, не печатая другие строки. Я правильно понял, о чем ваш вопрос? PS: Люди не должны гадать, вы должны приложить все усилия, чтобы вопрос был достаточно ясным., @Edgar Bonet

@EdgarBonet, что в этом интересного? Не хочешь сыграть в 20 вопросов? :), @Duncan C


1 ответ


1

внутри нее [уже напечатанная строка] val изменится в соответствии с чтение

Это «внутри него» не имеет большого смысла. «Печать» — это просто отправка байтов через последовательный порт, и вы не выбираете, где эти байты собирается: вы просто отправляете их по одному. Программа, которую вы используете в качестве Затем «монитор последовательного порта» отображает эти байты любым способом. считает нужным. Вы не можете контролировать с Arduino, где что происходит отображается.

Или, может быть, вы можете...

Если ваша программа монитора может эмулировать терминал старой школы, тогда он может понимать специальные управляющие последовательности, в том числе escape-коды, которые предписывают ему выполнять определенные действия, такие как перемещение курсора или стирание части экрана. Подходящие эмуляторы терминала включают экран в Linux и MacOS и Putty в Windows. Вы можете найти что-то подходящее для вашей мобильной платформы. В частности, Ардуино последовательный монитор не является эмулятором терминала и не интерпретирует эти управляющие последовательности.

Если вы используете подходящий эмулятор терминала, самый простой Решение вашей проблемы состоит в том, чтобы просто повторить все предложение «The объект находится на расстоянии xx,xx см» для каждого измерения, но делайте это с помощью перезапись текущей строки вместо перехода к следующей. Вы таким образом замените Serial.println() на Serial.print() и ставьте перед каждым предложение символом возврата каретки (ASCII CR = 0x0d = '\r'), что интерпретируется как команда «переместить курсор в начало линия”:

void loop() {
    float val = distance(32, 68);
    Serial.print("\rThe object is: ");  // обратите внимание на '\r'
    Serial.print(val);
    Serial.print(" cm away");  // нет println()
    delay(500);
}

Здесь есть одна оговорка. Если вы перезапишете предложение (например, «Объект: на расстоянии 10,07 см») на более короткий («Объект находится на расстоянии 9,92 см», один меньше символа), предыдущее предложение не будет полностью перезаписывается, поэтому на дисплее может появиться сообщение «Awayy». Этот можно преодолеть, обеспечив форматирование чисел фиксированной длины. отображается, заполняя пробелами или отправляя «стереть текущую строку» команду на терминал.

Кроме того, функция Serial.println() печатает то, что вы запрошенный, за которым следует символ CR, а затем символ перевода строки (ASCII LF = 0x0a = '\n'). Перевод строки интерпретируется терминала как команду «перевести курсор на следующую строку, не изменение его горизонтального положения».

Если вас раздражает повторяющийся вывод «The object is:», вы можете вместо этого используйте более сложные последовательности управления. Например:

  • «<ESC>[16G» означает «переместить курсор в столбец 16»
  • «<ESC>[K» означает «очистить от курсора до конца строки»

где <ESC> управляющий символ:

void loop() {
    float val = distance(32, 68);
    Serial.print("\x1b[16G\x1b[K");  // "\x1b" это escape-символ
    Serial.print(val);
    Serial.print(" cm away");
    delay(500);
}
,