Перейти к содержанию

Лабораторная работа 13. Передача данных с ПК

Цель работы:

Применение полученных знаний и навыков для создания управляющей программы микроконтроллера для управления свечением светодиода путем передачи команд с компьютера.

Практическая часть

Для написания управляющей программы микроконтроллера, необходимо рассмотреть следующие конструкции языка: цикл While, типы данных char и string.

Цикл while.

Описание:

Конструкция языка While() будет вычислять в цикле непрерывно и бесконечно до тех пор, пока выражение в круглых скобках не станет рав- но логическому false. Что-то должно изменять значение проверяемой пе- ременной, иначе выход из цикла while никогда не будет достигнут. Это изменение может происходить как в программном коде, например, при увеличении переменной, так и во внешних условиях, например, при те- стировании датчика.

Синтаксис:

While (выражение)


{

(( код внутри ))

}

Параметры:

выражение – оператор, который возвращает значение 1 («ИСТИНА») или 0 («ЛОЖЬ).

Тип данных char.

Описание:

Переменная типа char занимает 1 байт памяти и может хранить один алфавитно-цифровой символ (литеру). При объявлении литеры используются одиночные кавычки: ‘A’ (в отличие, например, от использования двойных кавычек при объявлении строки символов - тип данных string:«ABC»).

Синтаксис:

char symbol = ‘A’;

Символ хранится в памяти как число, соответствующее коду символа в таблице кодировки символов ASCII. Благодаря этому, с символом, как и с числом, можно производить арифметические действия (например, ‘A’

  • 1 будет 66, т.к. ASCII код для литеры ‘A’ - 65). Таблица символов ASCII приведена ниже:

Тип данных char - знаковый тип, это значит, что число (код), хранящееся в памяти, может принимать значения от -128 до 127. Если в управляющей программе необходимо применять без знаковую однобайтовую переменную, используйте тип данных byte.

Массив строк string

Описание:

В среде разработки Arduino IDE текстовые строки объявляются как массив типа char, оканчивающийся символом «конца строки».

Обычно строки принято завершать нулевым символом. Это позволяет функциям, при работе с элементами строки, выявлять ее окончание. В противном случае, могут считаться байты памяти, не принадлежащие переменной.

Синтаксис:

char myCharStr [ ] = “Start”; – массив типа char с завершающим пустым символом;

String myStr = “Start”; – объявляем переменную, создаем экземпляр

класса String и записываем в него константу-строку.

String myStr = String(“Start”); – аналогичен предыдущему: создаем строку из константы

String myStr(myCharStr); – создаем объект класса String с помощью конструктра, принимающего на вход массив типа char и создающего из char String.

String myStr = String(50); – создаем строку из целого числа (преобразование int to string).

Массив символов, выделяемый под строку, должен иметь один дополнительный элемент для символа окончания строки. Технически, возможно объявить строку без символа окончания строки, но это приведет к некорректной работе функций, оперирующих строками.

Схема подключения:

К данной рабочей программе используется следующая схема подключения (Рисунок 13.1). Для реализации проекта потребуются следующие компоненты: макетная плата, светодиод (1 шт), резистор на 220 Ом (1 шт) и провода.

Рисунок 13.1. Внешний вид схемы подключения

После сборки схема имеет следующий вид (Рисунок 13.2):

Рисунок 13.2. Внешний вид схемы после сборки

Рабочая программа:

#define LED_PIN 12


// для работы с текстом существуют объекты-строки String message;

void setup()

{

pinMode(LED_PIN, OUTPUT);

Serial.begin(9600);

}

void loop()

{

// Данные с компьютера передаются байт за

// байтом, в виде отдельных символов.

// Нужно последовательно их обрабатывать,

// пока в порту доступны новые данные.

// Метод available() объекта Serial возвращает количество

// байт, полученных через последовательный порт. 
while (Serial.available())

{

// Запись пришедшего символа в переменную. 
char incomingChar = Serial.read();

// Не стоит путать целые числа и символы.


// Они соотносятся друг с другом по кодировке.

// Символы в программе записываются в одинарных кавычках 
if (incomingChar >= 0 && incomingChar <= 9)

{

// если пришёл символ-цифра, добавляем его к сообщению 
message = message + incomingChar;

}

else if (incomingChar == ‘\n)

{

// При нажатии enter, сформированное сообщение

// переводится в целое число.

// Результат выводится на светодиод.

// Используется один из методов String, toInt(), который

// заставляет считать строку не набором цифр, а числом.

// Он возвращает значение типа long. 
analogWrite(LED_PIN, message.toInt());

// Обнуление накопленного сообщения.

// «» - пустая строка message = «»;

}

}

}

Список контрольных вопросов:

  1. Как работает цикл while?
  2. Какие параметры имеет while?
  3. В чём особенность типа данных char?
  4. В каких случаях он используется?
  5. Какая система кодировки используется при хранении символов?
  6. Какие значения принимает тип char?
  7. Сколько памяти необходимо выделять при объявлении массивов?
  8. Каким типом данных объявляют массив строк?
  9. Какие варианты объявления существуют?
  10. Что будет если не выделить память на символ окончания строки?

Список дополнительных задач:

  1. Подключить дополнительный светодиод и изменить программу так, чтобы можно было управлять двумя светодиодами.
  2. Изменить программу так, чтобы светодиод можно было включить или выключить текстом.

Center-nav

← Назад | Оглавление | Вперёд →