Arduino Hello World в последовательном мониторе

Привет, нас попросили запрограммировать что-то, что, когда я ввожу что-то в последовательный монитор, оно печатает Hello world, но загвоздка в том, что оно печатает hello world только при условии, что ваш ввод в последовательный монитор является 3-битным вводом, и после этого мне нужен код, который затем не позволит ему печатать снова и снова. моя единственная проблема в том, что я не знаю, как подсчитать количество бит ввода, а также остановить его непрерывную печать.

void setup() {
  Serial.begin(9600);

}

void loop() {
  String readSerial;
    String input;
    while(Serial.available() > 0){// put your main code here, to run repeatedly:
    delay(2);
  input.concat(String((char)Serial.read()));
  return input;
  }
  Serial.println("HELLO WORLD");
}

, 👍0

Обсуждение

Это задание школьного класса?, @Mikael Patel

Пожалуйста, добавьте свой код., @Mikael Patel

Да, это. И это также задание перед самим уроком., @Underhanded CODE

Что именно вы подразумеваете под 3-битным вводом? Последовательный интерфейс отправляет только целые байты. Речь идет о конкретных значениях в 3 из 8 бит одного байта?, @chrisl

здесь сказано, что 3 готовых к чтению символа (байта) - это 3 бита? или мое предположение неверно?, @Underhanded CODE

Некоторые отдельные комментарии: «// поместите сюда свой основной код для повторного запуска:». Это комментарий, принадлежащий функции цикла, а не циклу while. Также «возвратный ввод» не является рекомендуемым способом кодирования. Одной из причин является то, что возврат в середине функции — плохая практика кодирования, но, более того, он возвращает тип, в то время как функция (void) не ожидает ничего возврата. Я не знаю, что вы хотите запрограммировать, поэтому не могу дать более полезных комментариев., @Michel Keijzers


2 ответа


1

Предполагаем, что скетч должен печатать «Hello World», когда входной символ имеет высоту 3 бита. Вот несколько разных вариантов подсчета количества бит, установленных в байте.

int bits1(int c) {
  int res = 0;
  for (int i = 0; i < 8; i++) {
    if ((1 << i) & c) res = res + 1;
  }
  return (res);
}

int bits2(int c) {
  int m = 0x80;
  int res = 0;
  do {
    if (m & c) res++; 
  } while (m >>= 1);
  return (res);
}

int bits3(int c) {
  int m = 0x80;
  int res = 0;
  do {
    res += (m & c) != 0; 
  } while (m >>= 1);
  return (res);
}

#define bits4(c) __builtin_popcount(c) 

#define bits bits4

void setup() {
 Serial.begin(9600);
 while (!Serial);
}

void loop() {
  if (Serial.available() > 0) {
    int c = Serial.read();
    if (bits(c) == 3) {
      Serial.print((char) c);
      Serial.print(':');
      Serial.print(c, BIN);
      Serial.println(": Hello World");
    }
  }
}
,

3

Судя по комментариям, у вас отстают некоторые базовые знания. Чтобы по-настоящему усвоить то, что вы должны изучить в этом задании, вам следует просмотреть учебные материалы или руководства по C/C++ и Arduino в Интернете. Здесь я лишь дам вам несколько аргументированных подсказок, которые могут помочь вам в решении задания. (К сожалению, не очень понятно, в чем именно здесь заключается задача)

  • Интерфейс Serial Arduino (интерфейс UART) отправляет данные в байтах по одному и один за другим (отсюда и название serial). 1 байт представляет собой серию из 8 бит, каждый из которых имеет значение 1 или 0. Вместе 8 бит образуют значение, которое также может быть выражено десятичным значением от 0 до 255. Например, 01001011 — это двоичный эквивалент десятичного числа 75. (Для дальнейших объяснений используйте двоичную систему счисления в Google). Байтовые данные также могут быть выражены в виде символов, как они определены в стандарте ASCII. Каждое двоичное значение относится к определенному символу. Это то, что происходит в последовательном мониторе Arduino IDE. (Для получения дополнительных объяснений используйте Google ASCII)
  • Поскольку данные передаются последовательно, могут возникнуть некоторые задержки при передаче, незаметные для человека, но Arduino достаточно быстр, так что команда Serial.available() может вернуть результат 0, потому что в этот момент произошла небольшая задержка передачи. Следовательно, важно уловить все сообщение, прежде чем пытаться с ним работать. Вы можете сделать это, подсчитав байты (подождав, пока в буфере не останется не менее 3 байтов) или пометив конец сообщения специальным символом (например, символом новой строки '\n'). В сети есть множество уроков, как сделать и то, и другое. Вы можете начать с блога Маженко.
  • Вы можете получить количество полученных байтов с помощью возвращаемого значения Serial.available(). Он вернет 3, когда в буфере есть 3 готовых к чтению байта.
  • Если вы определите переменную внутри цикла void(), она будет выброшена, когда функция завершится, и переопределена, когда функция запустится снова (в мире Arduino цикл void () вызывается снова и снова навсегда). Вы потеряете весь контент, записанный в эту переменную. Если вы хотите сохранить данные при выполнении функции voidloop(), вы можете определить переменную вне любой функции в верхней части вашей программы. Тогда эта переменная станет глобальной и будет определена только один раз в начале программы и будет храниться на протяжении всего времени ее существования.
  • Как написано в комментарии, вы не должны возвращать значение из функции void, поскольку void в основном означает, что возвращаемого значения нет. А возврат из функции voidloop() приведет только к перезапуску этой функции (поскольку мы находимся в мире Arduino).
  • Вы можете отказаться от delay(2). В этом нет необходимости. А если работает только с задержкой, значит, что-то еще не так, и вы просто работаете с симптомами, а не с реальной проблемой.

Также не стоит пытаться построить все самостоятельно и изобретать велосипед. Вместо этого попробуйте взглянуть на примеры, поставляемые с Arduino IDE. Например, пример SerialEvent, который показывает, как получить последовательное сообщение (оканчивающееся символом новой строки '\n'). Также обратите внимание на другие связанные примеры. Если вы поймете, как они работают, вы сможете без проблем выполнить задание.

,

Привет еще раз, я думаю, что я близок к этому, но есть один быстрый вопрос: как сбросить Serial.available(); значение и вернуть его обратно в 0?, @Underhanded CODE

Вы можете выполнить Serial.read() без использования возвращаемого значения, пока Serial.available() не вернет 0., @chrisl