Arduino:Примеры/ConsoleASCIITable

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Вывод ASCII-таблицы через Console[1]

Этот пример для Arduino Yun демонстрирует, как при помощи класса Console выводить на компьютер таблицу с ASCII-значениями в десятичном, шестнадцатеричном, восьмеричном и двоичном видах. Более подробно об ASCII можно почитать, например, здесь.

Класс Console основан на библиотеке Bridge и позволяет вам отсылать информацию от Yun на компьютер. То есть он работает практически также, как и Serial, но предназначен для передачи данных беспроводным способом. Console создает безопасное соединение между Yun и вашим компьютером при помощи сетевого протокола SSH.

Когда Yun и компьютер подключатся к одной сети, запустите среду разработки Arduino, а затем откройте пункт меню «Инструменты» > «Порт» – Yun будет находиться именно здесь.

Необходимое оборудование

  • Плата Arduino Yun;
  • Компьютер и Yun должны находиться в одной сети (проводная или беспроводная – неважно);

Цепь

  • Для этого примера цепи строить не нужно.

Код

Подключаем класс Console (он является наследником библиотеки Bridge).

#include <Console.h>

Создаем переменную, где будут храниться данные, выводимые в окне консоли. ASCII-символы до «32» невидимы, поэтому инициализируем переменную значением «33» (оно соответствует символу «!»).

int thisByte = 33;

В секции setup() инициализируем Bridge и Console, а затем ждем открытия порта. Если соединение установилось, выводим небольшое сообщение о том, что произойдет дальше:

void setup() { 
  Bridge.begin();
  Console.begin(); 

  while (!Console) {
    ; // ждем подключения порта 
  }

  Console.println("ASCII Table ~ Character Map"); // "Таблица ASCII ~ Диаграмма символов"
}

В секции loop() выводим значение в нескольких разных форматах.

Чтобы увидеть ASCII-значение этой переменной, воспользуемся функцией Console.write(). В результате консоль переведет все заданные нами байты в ASCII-символы.

Console.write(thisByte);

Функция Console.print() выведет значение в виде строки «дешифрованных» ASCII-символов. Причем по умолчанию она выводит значения в десятичном виде.

Console.print(thisByte);

Функции Console.print() и Console.println() тоже могут отсылать на окно консоли строки со значениями, соответствующими тому или иному модификатору – шестнадцатеричному (HEX), восьмеричному (OCT) или двоичному (BIN). Кроме того, функция Console.println() добавляет строке символы новой строки и разрыва строки – это создаст в окне консоли перевод строки.

Console.print(thisByte, HEX);     
Console.print(thisByte, OCT);     
Console.println(thisByte, BIN);

В этом примере выводиться будут только алфавитно-цифровые символы, существующие в американской клавиатурной раскладке, поэтому завершим таблицу байтом со значением «126». Чтобы скетч, перед тем как остановиться, отправил все необходимые данные, воспользуемся функцию Console.flush().

if(thisByte == 126) {  
    Console.flush();

    while(true) { 
      continue; 
    } 
  }

Чтобы при следующем проходе через цикл скетч занялся следующим по списку символом, увеличиваем значение в переменной thisByte на один.

thisByte++;

Весь скетч полностью – ниже:

/*
  Вывод ASCII-таблицы через консоль

  Выводит на окно консоли байты со значением от 33 до 126 во всех возможных форматах:
 * в исходном двоичном значении
 * в «дешифрованных» десятичном, шестнадцатеричном, восьмеричном и двоичном значениях

 Более подробно об ASCII можно прочесть тут (http://www.asciitable.com) и тут (http://en.wikipedia.org/wiki/ASCII)

 Цепь:  Никакого внешнего оборудования не требуется.

 Создан в 2006 Николасом Замбетти (Nicholas Zambetti),
 модифицирован 9 апреля 2012 Томом Иго (Tom Igoe),
 еще раз модифицирован 22 мая 2013 Кристианом Мэгли (Cristian Maglie)

 Этот код не защищен авторским правом.

 <http://www.zambetti.com> 

 */

#include <Console.h>

void setup() { 
 // Инициализируем Console и ждем открытия порта:
  Bridge.begin();
  Console.begin(); 

  // Раскомментируйте строчку кода ниже, чтобы включить буферизацию, которая:
  // - улучшит эффективность и скорость передачи данных 
  // - потребует вызова Console.flush() для обеспечения того,  
  // чтобы скетч в любом случае отправил все необходимые данные.

  // Console.buffer(64);

  while (!Console) {
    ; // ждем подключения порта Console.
  }

  // Выводим заголовок с символом перевода строки в конце: 
  Console.println("ASCII Table ~ Character Map");  // "Таблица ASCII ~ Диаграмма символов"
}

// Первым видимым символом в таблице ASCII является «!», которому соответствует число «33»:
int thisByte = 33; 
// Впрочем, вместо чисел можно сразу указать ASCII-символ, 
// но делать это нужно в одинарных кавычках.
// Например, '!' – это то же самое, что и «33», поэтому в скетче можно написать и так:
// int thisByte = '!';  

void loop() { 
  // Сначала выводим значение в его неизменном виде, т.е. исходную бинарную версию байта.
  // Консоль переведет все байты в ASCII-символы,
  // т.е. самый первый номер, «33», будет показан как «!»:
  Console.write(thisByte);

  Console.print(", dec: "); 
  // Выводим в виде строки «дешифрованное» десятичное значение.
  // Для функций Console.print() и Console.prinIn() десятичный формат является форматом по умолчанию,
  // поэтому модификатор не требуется:
  Console.print(thisByte);
  // Впрочем, если хотите, то модификатор для десятичного формата все же можно продекларировать,
  // поэтому нижеуказанная строчка кода, если ее раскомментировать, тоже будет работать:

  // Console.print(thisByte, DEC);  

  Console.print(", hex: "); 
  // Выводим в виде строки «дешифрованное» шестнадцатеричное значение: 
  Console.print(thisByte, HEX);     

  Console.print(", oct: "); 
  // Выводим в виде строки «дешифрованное» восьмеричное значение:
  Console.print(thisByte, OCT); 

  Console.print(", bin: "); 
  // Выводим в виде строки «дешифрованное» двоичное значение, 
  // а в конце ставим символ перевода строки:
  Console.println(thisByte, BIN);

  // Если добрались до последнего видимого символа,
  // т.е. до «~» (он же «126»), останавливаемся:
  if(thisByte == 126) {     // но можно написать и if (thisByte == '~') {
    // Ставим, чтобы обеспечить отправку всех данных до единого:
    Console.flush();

    // Этот цикл длится бесконечно и ничего не делает:
    while(true) { 
      continue; 
    } 
  } 
  // Переходим к следующему символу:
  thisByte++;  
}

См.также

Внешние ссылки